普通lisp中的格式函数有一个~/name/
指令,允许您调用任意函数来格式化值。但是,根据文档,名称不能包含/。但是,#/是符号中的有效字符,因此是函数名称。那么,有没有办法逃避传递给〜//指令的函数名中的#/?
答案 0 :(得分:3)
不是。
但是你可以编写一个具有合法名称的函数,该函数调用该函数,然后需要与参数一起传递。与此示例类似:
(defun foo (&rest args)
(apply (first (second args))
(first args)
(second (second args))
(cddr args)))
CL-USER 52 > (defun ba/r (&rest args) (print args))
BA/R
CL-USER 53 > (format t "~/foo/" '(ba/r (1 2)))
(#<LW-XP::XP-STRUCTURE 41C00D8B1B> (1 2) NIL NIL)
NIL
答案 1 :(得分:1)
22.3.5.4 Tilde Slash: Call Function
~/name/
用户定义的函数可以在格式字符串中调用 使用指令〜/ name /。冒号修饰符,符号修饰符, 并且可以使用〜/ name /指定任意多个参数 指示。 name可以是任何不包含的任意字符串 &#34; /&#34 ;.名称中的所有字符都被视为上层字符 案件。如果name包含单个冒号(:)或双冒号(::),那么 所有事情,但不包括第一个&#34;:&#34;或&#34; ::&#34;被带走了 是一个命名包的字符串。第一个&#34;之后的一切:&#34;要么 &#34; ::&#34; (如果有的话)被认为是一个命名符号的字符串。该 通过查看获得对应于〜/ name /指令的函数 在指定的包中具有指定名称的符号。如果 name不包含&#34;:&#34;或&#34; ::&#34;,然后整个名称字符串是 在COMMON-LISP-USER包中查找。
您可以使用tilde-slash指令调用许多符号;包含#\/
的符号只是一种。其他人的名字中有冒号,或者是小写字母。