LINUX.ORG.RU

Переопределение специальных операторов

 , ,


0

1

Хочу написать небольшой source-to-source транслятор с лиспа в некий другой язык. Могу ли я каким-либо образом переопределить специальные операторы, сохраняя возможность обращения к ним? Например, сделать полностью свой let, при этом оставив для макросов какой-нибудь LET или sb-kernel:let. Я знаю, что в схеме для этого есть няшный define-syntax, но как с этим обстоит дело в CL? Правкой readtable? Или как-то ещё? Да, я хочу именно let, lambda, а не my-let etc. Спасибо.

★★★★★

в определении пакета сделай shadow для символа, и будет у тебя свой символ let

lovesan ★★★
()

но как с этим обстоит дело в CL?

В CL есть пакеты.

no-such-file ★★★★★
()
Ответ на: комментарий от Sectoid

Ага, я разобрался, благодарю. lovesan

(defpackage :pkg)
(in-package :pkg)
(funcall (lambda () 666)) ;; -> undefined function
(cl::funcall (cl::lambda () 666)) ;; -> 666
Очень удобно, великолепно. А есть ли какая-нибудь возможность определить undefined function/variable hook без изобретания своего eval? Я хочу обращаться ко всяким сущностям вроде полей структур и не хочу для этого генерировать over 9000 функций, лишь конкретную непосредственно по запросу.

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от Sectoid

Да, действительно, что-то я как-то невнимателен.

mix_mix ★★★★★
() автор топика
Ответ на: комментарий от mix_mix

И cl:unbound-variable. Беда в том, что в sbcl там нет рестартов, позволяющих сделать что-либо осмысленное. Только abort. Подозреваю, что в других реализациях тоже.

naryl ★★★★★
()
Ответ на: комментарий от naryl

Подозреваю, что в других реализациях тоже.

В clisp есть рестарт use-value

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.