Common Lisp中使用字符串动态调用函数

应用场景:一个统计查询的后端程序,根据查询名称字符串分别调用相应的处理函数。

 

一般的处理方法,可以用一个全局的注册表,将名称字符串与函数名对应起来。但是,lisp程序员是很懒惰的,既然lisp环境本身已经提供了名称注册的机制,为什么还要自己写一套呢?事实上,Lisp环境本身的核心就在于 namespace 。

 

简单的说解决办法如下:

 

 

(defun q-hello () (format t "q-hello ok")) (defun q-world () (format t "q-world ok")) (defun call-by-name (name) (funcall (nth-value 0 (read-from-string name)))) 

 

执行如下:

 

CL-User(34): (call-by-name "q-hello") q-hello ok NIL CL-User(34): (CALL-BY-NAME "Q-WORLD") q-world ok NIL 

 

这是第一步的实现,但是没有进行异常处理,例如调用一个不存在的函数,系统会报异常。

 

待续。。

 

你可能感兴趣的:(lisp)