在 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。我第一次使用这种技术是在编写测试函数时。向它发送一个函数和一个预期值,它会测试它是否按预期工作 - 包括将函数的名称作为字符串的一部分打印出来。如果您有时间设置测试,这非常有用。
在指定条件下,我想在这个函数中打印函数名。但我不知道如何得到它。
在 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。我第一次使用这种技术是在编写测试函数时。向它发送一个函数和一个预期值,它会测试它是否按预期工作 - 包括将函数的名称作为字符串的一部分打印出来。如果您有时间设置测试,这非常有用。