例如,我将函数名称传递给另一个函数
(personal-function 'func-name '(attr1 attr2 ...))
我想做的是
(defun personal-function (func-name)
(defun func-name '(attr1 attr2 ...) (dosomething)))
然而,它说我不能defun
带有符号......我该怎么办?
答案 0 :(得分:4)
使用
(setf (symbol-function my-symbol) some-function)
使用
创建一个新函数(compile nil (list 'lambda args body))
其中args和body具有有意义的值。
答案 1 :(得分:2)
按如下方式解决:
e.g1
(defun create-function(a1)
(defun plus-function(x) (+ x a1)))
(create-function 2) -> PLUS-FUNCTION
(plus-function 3) ->5
e.g2
(setf (symbol-function 'printx) #'(lambda (x) (print x)))
(printx '(1 2 3)) -> (1 2 3)
以前我在定义函数时也遇到了同样的问题。
示例:
(defun test-function(fn)
(defun fn ((lambda() (print "aaa")))))
我跑完后
(test-function 'aaafunction)
评估结果是
FN
它不会返回名为“aaafunction”的函数......
给那些拒绝我的回答的人: 我们是Lisp的新手,但我们正在努力学习知识,而你却不那么尊重。
答案 2 :(得分:1)
你可以使用lambda
http://www.n-a-n-o.com/lisp/cmucl-tutorials/LISP-tutorial-21.html
如果你试图在函数内部创建一个新的全局可访问函数,我认为语言的语法不允许这样做。如果创建lambda,则可以将变量初始化为此lambda值,并将变量传递给函数。在Common LISP中,您可以在尝试调用变量之前调用(functionp x)来确定变量是否为函数。
答案 3 :(得分:0)
我使用defmacros进行元编程,例如,this emacs lisp示例。
答案 4 :(得分:0)
使用宏将是一个不错的选择。如 (defmacro个人功能(功能名称) `(defun,func-name'(attr1 attr2 ...)(dosomething))) 请试一试,希望能帮到你。