在 AutoLISP 中是否可以在函数体中获取函数名称?

In AutoLISP is it possible to get function name in function body?

在指定条件下,我想在这个函数中打印函数名。但我不知道如何得到它。 在 C++ 中,我可以使用预处理器宏 __FUNCTION__。我在 AutoLISP 中有类似的东西吗?

这绝对有可能。我们来看两种情况:

1) 你正在编写函数。

这应该很简单,只需定义一个与函数同名的变量即可。 (正如上面评论中所讨论的那样。)

您甚至可以使用比函数的实际名称更具描述性的名称。 (defun af () ...) 可以称为 "Awesome Function" 而不是 "af"。

我还建议使用标准常量值格式:大写字母和下划线分隔单词。 (setq FUNCTION_NAME "AwesomeFunction")。 (这就像为您设置的 PI,您不应该更改它 - 它是一个 常量 。)

2) 您调用的函数在代码运行之前可能不知道其名称。

这方面的一些例子:

(apply someFunctionInThisVariable '(1 2 3))

(mapcar 'printTheNameOfAFunction '(+ setq 1+ foreach lambda))

(eval 'anotherFunctionInAVariable)

要打印存储在变量中的函数的名称 - 像这样 (setq function 'myFunction) - 你需要使用 (vl-princ-to-string) 函数。

(vl-princ-to-string function)   ;; Returns "MYFUNCTION"
(strcase (vl-princ-to-string function) T)   ;; Returns "myfunction"

(princ
   (strcase 
      (vl-princ-to-string function)
      T
   )
)            ;; Command line reads: myfunction

(vl-princ-to-string) 函数可以用于任何可以打印的类型,并且总是 return 一个字符串。如果你不知道你有数字还是单词等,那就太好了

希望对您有所帮助!

P.S。我第一次使用这种技术是在编写测​​试函数时。向它发送一个函数和一个预期值,它会测试它是否按预期工作 - 包括将函数的名称作为字符串的一部分打印出来。如果您有时间设置测试,这非常有用。