lisp, cbFuns и примеры

Если на “интерфасинг“ смотреть как на практики внедрение одного кода в другой, то функции обратного вызова тоже нужно отнести к этой теме. В принципе, то же касается и “враппер-функций”.
В документации, в связи с лексическим элементом “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 формат от Карла Сассенрата …
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
Всегда чему-то учусь!