Как я могу переопределить кавычки в общем LISP? - PullRequest
1 голос
/ 02 января 2011

Мне нужно переделать обратную кавычку (с разделением кавычек и без кавычек) без использования макросов встроенного считывателя `, @ Ожидаемое поведение:

> (BACKQUOTE (A B (LIST ‘C ‘D) (COMA (LIST ‘E ‘F)
                               (COMA-AT (LIST ‘G ‘H)))
(A B (LIST ‘C ‘D) (E F) G H)

Я пытаюсь сделать это с макросом, но результатожидаемого нет.

Огромное спасибо !!!

Любые намеки на то, что можно сделать?

Ответы [ 2 ]

3 голосов
/ 02 января 2011
0 голосов
/ 07 января 2011

Для тех, кто хорошо согласился с простым и неправильным решением, но оно работает, пытаясь понять код Пола Грэма:

(defmacro backquote (expr)
  (labels
      ((step (p n)
             (append p
                     (if (atom n) (list n)
                       (case (car n)
                         ('comma (list (eval (cadr n))))
                         ('comma-at (eval (cadr n))))))))
    (list 'quote (reduce #'step (cons () expr)))))

исправления и предложения по его улучшению приветствуются!

...