Function 在Common Lisp中将函数转换为字符串或符号

Function 在Common Lisp中将函数转换为字符串或符号,function,common-lisp,symbols,Function,Common Lisp,Symbols,在common lisp中是否可以将函数转换为符号或字符串以供进一步使用?我的意思是从“+”或:|+|中获得一个“+”唯一的标准方法是 这并不能保证返回任何有用的东西 无论如何,CLISP和SBCL都返回实际的函数名: (nth-value 2 (function-lambda-expression #'+)) ==> + 或者,如果你愿意 (symbol-name (nth-value 2 (function-lambda-expression #'+))) ==> "+" 我

在common lisp中是否可以将函数转换为符号或字符串以供进一步使用?我的意思是从
“+”
:|+|
中获得一个
“+”

唯一的标准方法是 这并不能保证返回任何有用的东西

无论如何,CLISP和SBCL都返回实际的函数名:

(nth-value 2 (function-lambda-expression #'+))
==> +
或者,如果你愿意

(symbol-name (nth-value 2 (function-lambda-expression #'+)))
==> "+"

我想知道这种需求从何而来。@zut在其他一些语言(如Python)中,函数对象有一个name属性,这在某些情况下可能很有用(例如在Python中使用decorators实现多方法)。也许OP正在调查类似的事情。虽然OP可以将其包装在[function,name]的cons单元格中,但更容易知道CL是否已经有了这样的name属性,而不必将function对象包装在这样的接口中。不过只是猜测而已。@CL中的字节则相反。函数是符号(名称)的属性,而不是函数的属性。如果两者都需要,则应使用符号并通过符号访问函数。@jkiiski同意,但我认为对于用“flet”或“let with#”(lambda…)进行词汇定义的函数对象,情况并非如此。如果我没有记错letoverlambda的书,编译器在使用'let'时不会创建符号对象,因此(符号函数…)没有意义。let绑定只是指向函数对象的指针的堆栈槽。的确,使用
FLET
/
标签定义的函数不会分配给符号(当然,您可以自己自动分配它们)。出于调试目的,至少在SBCL上,答案中建议的
函数-LAMBDA-EXPRESSION
似乎会返回一个列表
(FLET)
/
(标签)
/
(LAMBDA)
,但这些当然不是实际的函数名(即使手动将函数分配给符号的符号函数槽,也会返回这些函数,这表明sds所说的“不保证返回任何有用的内容”)。
(symbol-name (nth-value 2 (function-lambda-expression #'+)))
==> "+"
(defun function-name (fn)
  (string-downcase (symbol-name (nth-value 2 (function-lambda-expression fn)))))

(function-name #'atom) => "atom"