如何实现根据关键词自动调度调用对应函数的Function或Macro
实现方案
你的需求可以通过动态符号转换实现,完全不需要提前维护cond分支、哈希表这类调度表,只需要在调用时把输入的关键词转为对应函数符号再执行即可,以下是Common Lisp环境的实现:
核心代码
(defun dispatchme (kw) (let* ((kw-str (string kw)) (target-func-sym (intern (concatenate 'string kw-str "!")))) (funcall (symbol-function target-func-sym))))
逻辑说明
- 调用
string处理关键词时,会自动去除前缀的冒号,比如输入:foo会直接得到字符串"FOO"(Common Lisp默认符号名大写,如果你定义的函数是小写命名,可加一层string-downcase转换) - 把得到的关键词字符串末尾拼接感叹号,再转为对应的函数符号
- 最后通过
symbol-function获取符号对应的函数引用,用funcall直接执行即可
适配小写函数的版本
如果你的代码习惯用小写命名函数,可以调整为:
(defun dispatchme (kw) (let* ((kw-str (string-downcase (string kw))) (target-func-sym (intern (concatenate 'string kw-str "!")))) (funcall (symbol-function target-func-sym))))
测试示例
首先定义目标函数:
(defun foo! () (print "foo! 执行成功"))
调用(dispatchme :foo)就会输出"foo! 执行成功",完全符合需求。
如果使用其他Lisp方言(比如Scheme、Clojure),实现逻辑完全一致,只需要替换对应方言的关键词转字符串、字符串拼接、函数查找、函数调用的内置方法即可。
内容的提问来源于stack exchange,提问作者Dr Rama Lakshmanan
相关产品推荐
相关产品推荐

