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

时间:2016-03-29 07:45:12

标签: lisp autocad-plugin autolisp

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

1 个答案:

答案 0 :(得分:0)

这绝对是可能的。让我们看看两种情况:

1)您正在编写该功能。

这应该很简单,只需定义一个与函数同名的变量,你就可以了。 (如上面的评论所述。)

您甚至可以使用比函数的实际名称更具描述性的内容。可以调用(defun af () ...)"令人敬畏的功能"而不是" 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)函数可用于任何可以打印的类型,并始终返回一个字符串。如果您不知道自己是否有数字或单词等,那就太棒了。

希望有所帮助!

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