run ...

Как лексема уже представлена в двух ипастасиях, и как функция, и как переменная.
($Run "*Run" $Nil)
...
(NIL "run" _Run)
src/glob.l
Структура кода очень похожа на eval
# (run 'any ['cnt]) -> any
(de _Run (Exe)
(let (X (cdr Exe) E (eval (car X)))
(cond
((num? E) E)
((sym? E) (val E))
(T
(save E
(when (pair (cdr X))
(let N (needCnt Exe (eval (car @)))
(when (setq N (int N))
(let Bnd (val $Bind)
(loop
(? (=0 Bnd))
(?
(and
(== $At (val 2 Bnd))
(prog
(set $At (val Bnd))
(=0 (dec 'N)) ) ) )
(setq Bnd (val 3 Bnd)) ) ) ) ) )
(runAt E) ) ) ) ) )
src/flow.l
Более того, фактически, те же зависимости - needCnt num? loop let runAt cdr cond car save set setq sym? prog pair val when and eval int \== \=0 ?
В случае последовательной реализации “параметрического полиморфизма“ использовалась бы какая-то одна функция вместо … !? по крайней мере, этой тройки - “run - exec - eval”, но здесь вот так, включая зоопарк таких лексем с префиксами и суффиксами. Наблюдается странный парадокс, с одной стороны, по несколько форм для “одной функции“ (или, по крайней мере, применении символа как функции), а с другой, активное использования лексемы с суффиксами и префиксами. Не знаю, може в лисп-подобных системах невозможно придерживаться какой-то единой парадигмы, в том смысле, что либо аффиксы, либо рефинементы как в Rebol. Вероятно, что это плата за контекстную зависимость и проблема не разрешима на уровне синтаксиса, в принципе.
Ну и, уже по традиции … типа реального применения …
(inline run (Prg)
(use @
(loop
(let X (++ Prg)
(? (atom Prg) (eval X))
(and (pair X) (evList X)) ) ) ) )
src/dec.l
Subscribe to my newsletter
Read articles from Sergey Shishkin directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Sergey Shishkin
Sergey Shishkin
Всегда чему-то учусь!