reflection - 在 Common Lisp 中拦截和修改用户输入

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

我在 common lisp 中定义了一个求值器,可以像这样简单地调用它:

(repl)

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

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

不过,我希望能够简单地调用 (.cos 90),并让它在 repl 中运行。有没有办法使用 lisp 的反射来拦截所有用户输入并在它之前调用另一个函数?

谢谢!

最佳答案

更好的方法是制作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))))) 

我假设您在 evaluators null 环境中定义了 printevalread

关于reflection - 在 Common Lisp 中拦截和修改用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30786928/

相关文章:

java - 为什么带有可变参数的 Java 方法被识别为 transient ?

ruby - 检测方法调用

c++ - 元编程和运行时代码生成

java - 如何使用反射(Java)调用私有(private)静态方法?

c# - 如何深度复制强类型集合的成员

java - 获取对象的类及其构造函数,Android中的Reflection

lisp - Quicklisp:存档大小错误

lisp - 子集求和问题和 NP 完全问题的可解性

string - 在 Lisp 中使用 cond 时显示字符串

ruby - remove_const :File