run ...

Sergey ShishkinSergey Shishkin
2 min read

Как лексема уже представлена в двух ипастасиях, и как функция, и как переменная.

   ($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

https://picolisp-manual.tiddlyhost.com/#run

0
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

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