- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
# это комментарий #
COMMENT это понятно что COMMENT
CO это тоже ко-ко-коментарий CO
CO функция принимает 3 параметра типа INT и возвращает ссылку на массив CO
PROC range = (INT start, end, step)REF[]INT : (
INT length = ABS((end - start) % step);
NEW [0 : length - 1]INT result; CO массив в куче CO
CO LWB —– нижний индекс массива, UPB —– верхний CO
FOR i FROM LWB result TO UPB result
DO
result[i] := start + i * step
OD;
result CO функции возвращают результат последнего вычесленного выражения CO
);
CO можно определять свои операторы CO
OP RANGE = (INT start, end)REF[]INT: range(start, end, (start < end | 1 | -1));
PRIO RANGE = 5; CO для бинарных операторов нужно задать приоритет, у сложения/вычитания приоритет = 6 CO
CO для операторов возможна перегрузка по количеству и типу аргументов CO
OP RANGE = (INT end)REF[]INT: 0 RANGE end;
OP ACCUM = ([]INT x, PROC(INT,INT)INT f)INT : (
INT length = UPB x - LWB x;
IF length = 0 THEN
1
ELIF length = 1 THEN
x[LWB x]
ELSE
INT result;
result := x[LWB x];
FOR i FROM LWB x + 1 TO UPB x
DO
result := f(result, x[i])
OD;
result
FI
);
PRIO ACCUM = 5;
CO правый операнд у ACCUM —– лямбда CO
OP ! = (INT x)INT: 1 RANGE x + 1 ACCUM ((INT x, y)INT: x * y);
printf(($g(0), "! = ", g(0), l$, 7, !7));
OP MAP = ([]INT x, PROC(INT)INT f)REF[]INT : (
NEW [LWB x : UPB x]INT result;
FOR i FROM LWB x TO UPB x
DO
result[i] := f(x[i])
OD;
result
);
PRIO MAP = 5;
PROC pow = (INT x, n)INT: x ^ n;
CO каррирование CO
printf(($g(0), " "$, RANGE 10 MAP pow(2, )));
print(new line);
OP FOREACH = (REF[]INT x, PROC(REF INT)VOID f)VOID : (
FOR i FROM LWB x TO UPB x
DO
f(x[i])
OD
);
PRIO FOREACH = 5;
REF[]INT a = -5 RANGE 6;
a FOREACH ((REF INT x)VOID:
x := x ^ 2
);
printf(($g(0), " "$, a))
Сам синтаксис –— жуткая смесь «Си» и «Паскаля». Ну они и вышли из «Алгола», только разделились на остроконечников и тупоконечников.
Порадовали операторы, которым программист может назначать приоритет. Даже в крестах такого нет: там готовый набор символов, которые можно переопределять, с заранее заданным приоритетом.
Встроенные операторы для определения границ индекса массива. Эти операторы унаследовали Паскаль (в виде функций High и Low) и язык Ада (в виде атрибутов 'First, 'Last, 'Range, 'Length), но проигнорировал язык Си. В сишке вообще арифметика указателей для бесконечной ленты вместо нормальных массивов, как будто мы собираемся реализовывать машину Тьюринга или интерпретатор Брейнфака.
Динамические массивы в куче с произвольными диапазонами индексов.
Анонимные функции.
Неужели всё это было в 1968-м году?
Про каррирование жду пояснений.
А в лиспе в это время уже GC был.
> гц весьма списифисиський.
Какой же?
Моя твоя не понимать.
Нет. Из более-менее распространённых лишпов иммутабельность поставлена во главу стола только в Racket.
этом примере pow(2,)) и всё? Так коротко?
https://ideone.com/QO1oCh
Если я правильно понял, то std::bind позволяет передавать аргументы в любом порядке. Т. е. можно сделать std::bind(f, _3, _2, _1), чтобы аргументы подставились задом наперёд?
Чёрт, 'J' меня испортил, я сперва подумал, что это отрицательные числа.
https://ideone.com/XN0Y4Y
https://ideone.com/WiUFJi
https://tinyurl.com/y9ghbkkm