Реализовать функцию Lisp eval в Common Lisp - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь реализовать функцию eval, используя CLISP.

Моя мотивация: предположим, у меня есть такая программа на Лиспе:

(defun call (arg)
  (cond
    (some-condition (call (other (strange (functions (on arg)))))
    (t nil)
  )
)

(defun mysterious-function (arg)
  (call (strange (functions (on arg))))
)

(mysterious-function 100)       ; only this line can be changed

Я хочу знать, что на самом деле называется (mysterious-function 100).

В настоящее время моя идея выглядит следующим образом, но есть следующие препятствия:

  1. Как найти символ (в настоящее время используется eval)
  2. Как получить определение функции (например, получить что-то вроде (defun f (x))) и затем проанализировать ее
  3. Как обнаружить макрос и развернуть его

Я в правильном направлении?

(defun my-eval (body)
  (cond
    ((typep body 'integer) body)
    ((typep body 'float) body)
    ((typep body 'rational) body)
    ((typep body 'complex) body)
    ((typep body 'boolean) body)
    ((typep body 'symbol) (eval body))
    ((typep body 'list) (eval body))
    (t (error))
  )
)

(my-eval '(mysterious-function 100))
...