拦截并修改Common Lisp中的用户输入

时间:2015-06-11 16:55:40

标签: reflection lisp metaprogramming read-eval-print-loop clisp

我在普通的lisp中定义了一个可以简单地调用的评估器:

(repl)

从那时起,repl可以解释像lisp一样不知道的函数调用,如(.cos arg)。

当然,要使用它,必须首先调用(repl),否则lisp不知道.cos是什么。

我希望能够简单地调用(.cos 90),然后让它在repl中运行。无论如何使用lisp的反射拦截所有用户输入并在它之前调用另一个函数?

谢谢!

1 个答案:

答案 0 :(得分:1)

更好的方法是制作my-eval,然后你可以做

(defun my-cos (arg) 
  (my-eval (list '.cos arg))) 

repl就像是

(defun my-repl ()  
  (my-eval '((lambda (ev) 
              (ev ev)) 
            (lambda (ev)
              (print (eval (read)))
              (ev ev))))) 

我假设您在评估者null环境中定义了printevalread