lisp, cbFuns и примеры

Sergey ShishkinSergey Shishkin
3 min read

Если на “интерфасинг“ смотреть как на практики внедрение одного кода в другой, то функции обратного вызова тоже нужно отнести к этой теме. В принципе, то же касается и “враппер-функций”.

В документации, в связи с лексическим элементом “callback” небогатый выбор интерпретаций. Что-то связанное с upd в базовом классе всех объектов +Entity и в описании функции lisp

(lisp 'sym ['fun]) -> num

Устанавливает под тегом sym функцию обратного вызова fun и возвращает указатель num, подходящий для передачи в функцию C через native. Если fun равен NIL, соответствующая запись освобождается. Таким образом можно установить максимум 24 функции обратного вызова. fun должна быть функцией максимум пяти чисел и должна возвращать число. "Числа" в этом контексте являются 64-битными скалярами и могут представлять не только целые числа, но и указатели или другие закодированные данные. См. также native и struct.

А теперь о “примерах” … Как известно на текущий момент существуют две книги, PicoLisp в работе - это том второй, и том первый - это Picolisp в примерах. Кстати, см. A collection of PicoLisp examples. Безусловно, что функции кодируются, чтобы их применять и с помощью них кодировать структуры и другие функции и, в принципе, примеры - основа обучения … но … разве код определений - не является примером? Практика написание самой системы! Тогда почему при описании функций авторы ограничиваются интерфейсом и игнорируют, собственно, описание архитектуры? Да, детально рассказывается про “ячекйи“ … то есть про базовый принцип организации структур … и все … да, все модели, включая принципы, … но реализация, алгоритмы, то есть интерпретация моделей - это и есть то, что является сутью любого кодирования, выражения, спецификаций и документации, в частности. Так что ставим эксперимент с мануалом, разбираясь с архитектурой системы.

А это, собственно, определение функции lisp.

# (lisp 'sym ['fun]) -> num
(de _Lisp (Exe)
   (let (X (cdr Exe)  Y (evSym X))
      (let (P $Lisp  Q (i8** (cbFuns)))
         (loop  # Search for tag 'sym'
            (? (== Y (val P)))  # Found
            (setq P (ofs P 2)  Q (ofs Q 1))
            (? (> P $LispEnd)  # Not found
               (setq P $Lisp  Q (i8** (cbFuns)))
               (until (nil? (val 2 P))  # Search for empty slot
                  (setq P (ofs P 2)  Q (ofs Q 1))
                  (when (> P $LispEnd)
                     (err Exe 0 ($ "Too many callbacks") null) ) )
               (set P Y) ) )
         (set 2 P (eval (cadr X)))  # Eval 'fun'
         (box64 (i64 (val Q))) ) ) )

map: pico~lisp (1626 "@src/main.l" llvm pico)

Очевидно, что функция, как алгоритм, используют другие функции, “тянет” за собой связи … и, конечно, было бы классно, если бы автор системы сам продемонстрировал “свой клубок”, начав с некоторй “базы” (кстати, такая библиотека есть (!), только не за документирована …), то есть, действительно, просто обобщал бы свою практику, акцентируя не только интерфейс, но и архитектуру. Но попробуем “хакнуть“ сами … А потом и примем решение об использовании системы … В любом, случае - опыт. Система уникальна, рабочая, документация удовлетворительная (не хуже других и похоже, что можно вывести критерий хорошей системы как параметр хорошей документации … привет, “прозрачность”!) и, в любом случае, систему можно рекомендовать в системе образования, если ещё более четко подчеркнуть связи не только с Prolog как БД SQL, но и Refal (двухсвязные списки и паттерны), а главное - тут же в одном флаконе Forth, APL и объектное прототипирование с префиксными классами … не говоря уже о сопрограммах! Ох, если бы не этот отвратительный синтаксис с лишними скобками! Где же ты наш ASON формат от Карла Сассенрата …

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

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