常见的lisp格式:使用〜/ directive在名称中使用斜杠调用函数

时间:2014-08-25 21:49:36

标签: io format common-lisp

普通lisp中的格式函数有一个~/name/指令,允许您调用任意函数来格式化值。但是,根据文档,名称不能包含/。但是,#/是符号中的有效字符,因此是函数名称。那么,有没有办法逃避传递给〜//指令的函数名中的#/?

2 个答案:

答案 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指令调用许多符号;包含#\/的符号只是一种。其他人的名字中有冒号,或者是小写字母。