Ключевое слово I/if



I <условие>
   ...




I <условие>
   ...
E
   ...


I <условие1>
   ...
E I <условие2>
   ...


I <условие1>
   ...
E I <условие2>
   ...
E
   ...

Два ключевых слова
E
/
else
и
I
/
if
идущие подряд трактуются специальным образом в 11l, благодаря чему отпадает необходимость в специальном/отдельном ключевом слове (как
elif
в Python или
elsif
в Ruby).

Также
I
/
if
и
E
/
else
можно использовать в выражениях в качестве альтернативы тернарному оператору
?:
из языка Си:
sign = I x < 0 {-1} E I x > 0 {1} E 0 // 11l
sign =  x < 0 ? -1  :  x > 0 ? 1 : 0; // C


Ключевые подслова I/if



I.unlikely <условие>
   ...
используется, чтобы указать компилятору, что условие в подавляющем большинстве случаев не будет выполнено.

Это влияет на генерацию машинного кода следующим образом:
  1. Тело оператора
    I
    /
    if
    переносится в отдельную ("холодную") область сегмента кода или в конец функции после всего "горячего" кода.
  2. Если тело оператора
    I
    /
    if
    состоит из одного вызова функции, тогда этот вызов не встраивается.
    Пример:
  3. Место в стеке под локальные переменные внутри тела оператора
    I
    /
    if
    выделяется не в ‘начале функции’/‘момент входа в функцию’, а в начале самого тела оператора
    I
    /
    if
    .
    Пример:

I.likely <условие>
   ...
используется, чтобы указать компилятору, что условие в подавляющем большинстве случаев будет выполнено.

Влияет на генерацию машинного кода только при наличии ветки
E
/
else
, код в которой получает пометку "unlikely".