关于lisp:在-Lisp-中使用-reader-macro-支持-JSON-语法
在 Lisp 中应用 reader macro 反对 JSON 语法什么是 reader macro?Reader macro 是 Common Lisp 提供的泛滥乏味个性之一,它让语言的使用者可能自定义词法分析的逻辑,使其在读取源代码时,如果遇到了特定的一两个字符,能够调用相应的函数来个性化解决。此处所说的“特定的一两个字符”,被称为 macro character,而“相应的函数”则被称为 reader macro function。举个例子,单引号'就是一个 macro character,能够用函数get-macro-character来获取它对应的 reader macro function。 CL-USER> (get-macro-character #\')#<FUNCTION SB-IMPL::READ-QUOTE>NIL借助单引号,能够简化一些代码的写法,例如表白一个符号HELLO自身能够写成这样。 CL-USER> 'helloHELLO而不是上面这种等价但更繁琐的模式。 CL-USER> (quote hello)HELLOCommon Lisp 中还定义了由两个字符形成的 reader macro,例如用于书写simple-vector字面量的#(。借助它,如果想要表白一个顺次由数字 1、2、3 形成的simple-vector类型的对象,不须要显式地调用函数vector并传给它 1、2、3,而是能够写成#(1 2 3)。 反对 JSON 语法后有什么成果?非法的 JSON 文本不肯定是非法的 Common Lisp 源代码。例如,[1, 2, 3]在 JSON 规范看来是一个由数字 1、2、3 组成的数组,但在 Common Lisp 中,这段代码会触发 condition。(condition 就是 Common Lisp 中的“异样”、“出情况”了) CL-USER> (let ((eof-value (gensym))) (with-input-from-string (stream "[1, 2, 3]") (block nil (loop (let ((expr (read stream nil eof-value))) (when (eq expr eof-value) (return)) (print expr))))))[1 ; Evaluation aborted on #<SB-INT:SIMPLE-READER-ERROR "Comma not inside a backquote." {1003AAD863}>.这是因为依照 Common Lisp 的读取算法,左方括号[和数字 1 都是规范中所指的 constituent character,它们能够组成一个 token,并且最终被解析为一个符号类型的对象。而紧接着的字符是逗号,,它是一个 terminating macro char,依照规范,如果不是在一个反引号表达式中应用它将会是有效的,因而触发了 condition。 ...