symbols

Sergey ShishkinSergey Shishkin
4 min read

Не смотря на посты Symbol и Символьные функции, решил акцентировать отдельно symbols, чтобы на этом примере спроектировать сруктуру описания функции с кодом определения, зависимостями и комментариями ИИ-ботов. Функция, подобно “include”, сопровождает все файлы “библиотек-модулей”. В файле pil21/lib/map на 1578-ой видим pico~symbols (643 "src/sym.l" llvm pico). Идем в src/sym.l и … видим только комментарий с уже знакомым интерфейсоми и далее - код определения _Symbols

# (symbols) -> lst
# (symbols 'lst) -> lst
# (symbols 'lst . prg) -> any
# (symbols ['T] 'sym1 'sym2 ..) -> lst
(de _Symbols (Exe)
   (let X (cdr Exe)
      (if (atom X)  # No args
         (val $Intern)
         (let Y (eval (++ X))
            (if (pair Y)  # List argument
               (let L Y
                  (loop
                     (needNsp Exe (needSymb Exe (++ L)))
                     (? (atom L)) )
                  (if (atom X)  # No 'prg'
                     (prog1
                        (val $Intern)
                        (set $Intern Y) )
                     (let Z (save (val $Intern))
                        (set $Intern Y)
                        (prog1
                           (run X)  # Run 'prg'
                           (set $Intern Z) ) ) ) )
               (let F (t? Y)
                  (when F
                     (setq Y (eval (++ X))) )
                  (if
                     (or  # New namespace
                        (nil? (val (needSymb Exe Y)))
                        (== @ Y) )
                     (set
                        (chkVar Exe Y)
                        (cons $Tilde (cons $Nil $Nil)) )
                     (needNsp Exe Y) )
                  (let R (setq Y (save (cons Y $Nil)))
                     (while (pair X)
                        (setq Y
                           (set 2 Y
                              (cons
                                 (needNsp Exe (needSymb Exe (eval (++ X))))
                                 $Nil ) ) ) )
                     (prog1
                        (val $Intern)
                        (set $Intern R)
                        (when F
                           (set (val $NsLink) R) )
                        (putSrc (car R) 0) ) ) ) ) ) ) ) )

… из 618 позиции в map … llvm~_Symbols (643 "src/sym.l" llvm pico).

Ну что ж, прошу Gemini прокомментировать этот код, что бот прекрано делает! А далее, на всякий случай прошу найти и прокомментировать symbols … и …

(de symbols . prg)
   (ifn prg
      (val $Intern)
      (let L (pop 'prg)
         (apply 'run (cons '_Symbols (cons L prg))) ) )

… а лежит типа в lib/lib.l …

Отлично! Идем туда и находим только код для -symbols

(de -symbols ()
   (apply symbols (symbols) (intern (opt))) )

Возвращаемся к теме Инвокация, на всякий случай проcим в чате прокомментировать и эту концепцию в PicoLisp.

Не стал мучить Chat GPT, поскольку бесплатный суточный лимит с ним ушел на попыки определить общую структуру тиддлера для мануала. Кстати, он даже предожил его скачть как JSON и, фактически, тиддлеры удалось импортировать и посмотреть!

Cloud уже просто рокомментировал код и тоже указал на lib/lib.l … аргументируя тем, что типа там должно быть исходя из общих принципов организации кода, но конкретно не нашёл и рассказать про зависимости ему не удалось, вероятно, опять же из-за бесплатного лимита.

Неплохо прокомментировал уже предоставленный код perplexity, но его расположение тоже так и не нашёл.

Хорошо справился с задачей комментирования кода Grok, но место тоже не нашёл, порекомендовав искать в файле src/main.l.

Прокомментировал, но тоже не нашёл быстрый Мистраль. С поиском не помог и Yuo.com, но тоже справился с комментированием.

Приколол DeepSeek со своей версией symbols

(de symbols (Ns . Prg)
   (let Old (current)
      (current Ns)
      (run Prg 1)
      (current Old) ) )

Вероятно, вытащил из другого Лиспа, кстати, с поиском места тоже пустился фантазировать … Поскольку он расшаривать не дает, то ссылку не привожу. Но точно могу сказать, что он комментирует много строк кода.

Ну а что с зависимостями? Grock акцентировал такие три:

  • $Intern: Глобальный символ, представляющий таблицу внутренних символов.

  • run: Встроенная функция PicoLisp, которая интерпретирует и выполняет код.

  • _Symbols: Внутренний символ, используемый для указания на создание новой области видимости.

И не помню, кто из ботов, тоже не забыл про зависимости, что было указано в промте, и аккуратно перечислил из кода их все : prg, ifn, val, let, pop, apply, run, cons.

Вот такой эксперимент на пути к структуре мануала. И почему пример с инвокацией не рассмотрен на конкретном примере … Вот Вам и прозрачность … На грани призрачности … Трюки … и неописанные механизмы … или описанные не четко … и даже акцент на том, что возможны разные способы достижения цели … как достижение … ровно обратный принцип с Go … наконец, однозначность - это как раз про вычислительный процесс, который детерминирован “по определению” … и не случайно ассоциативный массив рулит как структура и тот же шитый код как по сути последовательность импликаций. Наконец, конвенции … а не любая приватная логика, которая может быть соврешенной, абсолютно рациональной, и даже оптимальной исходя из этих персональных критериев … но это не индустриальный прагматизм и точно не массовый рынок. Нужна дисциплина и институализация!

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

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