Macros set宏字符的非终止-p参数的作用是什么?

Macros set宏字符的非终止-p参数的作用是什么?,macros,common-lisp,Macros,Common Lisp,有一个名为non-terminating-p的可选参数。它似乎用于指示在读取宏字符后是否应读取另一个字符,但似乎忽略了此参数。是否将其设置为true或false有区别?如果将非终止-p设置为t,宏字符可以在符号名称中显示为不带转义(例如在符号foo\baz中)。如果将其设置为nil,并且读卡器在累积符号时遇到宏字符,则会终止符号的集合(如foo'bar中的',读作符号foo和列表(引号栏)) 请参见读取器算法中的步骤8——所讨论的参数将宏字符在被视为非终止宏字符和终止宏字符之间进行切换。例如,您

有一个名为non-terminating-p的可选参数。它似乎用于指示在读取宏字符后是否应读取另一个字符,但似乎忽略了此参数。是否将其设置为true或false有区别?

如果将
非终止-p
设置为
t
,宏字符可以在符号名称中显示为不带转义(例如
在符号
foo\baz
中)。如果将其设置为
nil
,并且读卡器在累积符号时遇到宏字符,则会终止符号的集合(如
foo'bar
中的
'
,读作符号
foo
和列表
(引号栏)


请参见读取器算法中的步骤8——所讨论的参数将宏字符在被视为
非终止宏字符
终止宏字符
之间进行切换。例如,您可以看到不同之处:

我们将使用两个不同的Unicode字符(这是使用LispWorks)。 当这些字符被用作符号的一部分时,它就变得有趣了

(defun single-quote-reader (stream char)             ; just an example, it won't be called
  (declare (ignore char))
  (list 'quote (read stream t nil t)))

(set-macro-character #\℅ #'single-quote-reader t)    ; non-terminating
(set-macro-character #\℆ #'single-quote-reader nil)  ; terminating

(defun test ()
  (list (read-from-string "foo℅bar")                 ; non-terminating
        (read-from-string "foo℆bar")))               ; terminating

CL-USER 21 > (test)
(FOO\℅BAR                                            ; non-terminating
 FOO)                                                ; terminating

其他答案解释了行为并给出了示例,但我认为值得指出并链接到规范。超光谱 描述非终止-p参数:

如果non-p为true,则char变为宏字符;否则它将成为一个宏字符

相关术语表条目:

非终止的。(指宏字符),当它出现在扩展标记的中间时,它被当作一个组成字符。看

终止n。(指宏字符)如果在解析令牌时出现,则终止该令牌。看

然后,正如所指出的,这里是读卡器算法的第八步:

  • 此时,正在累积令牌,并且遇到偶数个多转义字符。如果在文件末尾,则输入步骤10。否则,将读取字符y,并根据其语法类型执行以下操作之一:

    • 如果y是组成宏字符或非终止宏字符:

      • 如果y是带大小写的字符,根据当前可读表的可读大小写,它可能会替换为相反大小写的对应字符,如第23.1.2节(可读大小写对Lisp读取器的影响)所述
      • Y附加到正在生成的令牌
      • 重复步骤8
    • 如果y是终止宏字符,则它终止令牌。首先字符y未读(参见未读字符),然后输入步骤10