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

在AutoLISP中,是否可以在函数体中获取函数名?,lisp,autocad-plugin,autolisp,Lisp,Autocad Plugin,Autolisp,在指定的条件下,我想打印此函数中函数的名称。但我不知道如何得到它。 在C++中,我可以使用预处理器宏>代码>函数>代码>。我可以在AutoLISP中使用类似的工具吗?这绝对是可能的。让我们看两种情况: 1)您正在编写函数。 这应该很简单,只要定义一个与函数同名的变量,就可以了。(如上述评论所述。) 您甚至可以使用比函数的实际名称更具描述性的名称(defun af()…)可以称为“Awesome Function”,而不是“af” 我还建议使用标准的常量值格式:大写字母加下划线分隔单词(setq函

在指定的条件下,我想打印此函数中函数的名称。但我不知道如何得到它。
在C++中,我可以使用预处理器宏>代码>函数>代码>。我可以在AutoLISP中使用类似的工具吗?

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

1)您正在编写函数。

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

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

我还建议使用标准的常量值格式:大写字母加下划线分隔单词<代码>(setq函数\u名称为“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)
函数可用于任何可打印的类型,并始终返回字符串。如果你不知道自己是否有数字或单词等,那就太好了

希望有帮助


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

autolisp支持(lisp)宏吗?@DanielJour:我不认为它支持(尽管您可能可以为它实现一个宏系统)。我使用autolisp已经几年了,但从未见过lisp宏。lisp中的宏是什么意思?有什么例子吗?@CADDeveloper Lisp的宏是通常认为使其成为如此强大语言的功能之一。注释对于一个好的答案来说太小了,但关键是您可以在编译过程中修改源代码。例如,在公共Lisp中,使用open file是一个宏,它可以将
(使用open file(x)/tmp/foo”)…
转换为类似
(let((x(open)/tmp/foo”)(unwind protect(progn…(close x))
。我认为这里的要点是,您可以用公共Lisp编写一个宏,比如defunx,它可以将
(defunx name(…)…)
变成类似于……
(defun name(…)(let((_函数名))…)
,这将给您带来与C中类似的效果。我不明白为什么会将此标记为答案。无论是哪种情况,都没有神奇的方法来获取函数名。您必须以某种方式提供它。可能这就是CAD开发人员想要的。函数必须在某个地方的变量或参数中提供你可以使用它,对吗?上面的第二个例子告诉你如何访问不知道它之前提供的函数的名称。或者你认为OP在问别的什么吗?嗯,在C++中,f f f u nct i o n有你所用的函数的名字。我假设这是OP所要求的。我真的不知道什么。其他可能是指。根据,
\uuuuuu函数\uuuuuu
被视为在函数顶部定义的常量,如上面的答案1所示。我可以理解,复制它可能比键入函数名节省时间,但即使在该页的示例中,键入函数名也会更容易输入
\uuuu FUNCTION\uuuuu
的广告。上面的答案可能需要稍多的工作,但它创建了相同的功能:能够使用您所在函数的名称。我认为您缺少了
\uuuu FUNCTION\uuuuu
\uuuu funct\uuuuu
的全部要点。“标识符
\uuuu func\uuuu
由翻译人员隐式声明,如同….”(我添加的斜体)。