Common lisp 是否可以使用宏更改参数的类型?

Common lisp 是否可以使用宏更改参数的类型?,common-lisp,Common Lisp,宏是否可以用于更改代码中用于括号的字符?例如,(和)是否可以替换为[和]?在另一个问题上有更多的讨论(我认为这可能是重复的),但仍然值得展示这个特定的示例。请看这个问题,了解它是如何工作的 CL-USER> (set-macro-character #\[ (lambda (stream ignore) (declare (ignore ignore))

宏是否可以用于更改代码中用于括号的字符?例如,
是否可以替换为
[
]

在另一个问题上有更多的讨论(我认为这可能是重复的),但仍然值得展示这个特定的示例。请看这个问题,了解它是如何工作的

CL-USER> (set-macro-character #\[
                              (lambda (stream ignore)
                                (declare (ignore ignore))
                                (read-delimited-list #\] stream t)))
T
CL-USER> (set-macro-character #\] (get-macro-character #\)))
T


约书亚,如果你想用[and]来代替(and),你的答案是正确的,但是如果你想定义[and]以完全像(and)一样工作,你就有问题了。事实上,在上述调用之后,像
'(23]
这样的表单会导致一个错误(至少在CCL中):
error:Reader error on#,靠近位置6:Unmatched')。
@Renzo问题的确是说“例如可以(and)替换为[and]?”,但你说得很好,读取分隔的列表,直到一个特定的字符,直到它匹配“列表终止字符”(如果存在此类字符)。因此,如果不改变#的行为(因为#\(读到匹配的#\),就无法使#\]像#\)一样工作。
CL-USER> '[1 2 3]
(1 2 3)

CL-USER> [print 'hello]

HELLO 
;=> HELLO