gpt4 book ai didi

macros - 反引号字符串插值

转载 作者:太空宇宙 更新时间:2023-11-03 18:49:54 25 4
gpt4 key购买 nike

是否可以使用lisp的宏来做字符串插值?

例如,我可以制作这样的宏吗:

(defmacro test (a) `",a")

所以 (test abc) 以字符串形式返回“abc”?我可能会通过引用它并将该引号转换为字符串来作弊,但这不适用于像“9:00”(没有双引号)这样的参数。

最佳答案

Lisp 宏对 lisp 读者已经阅读过的参数进行操作。正因为如此,宏不能改变它的参数被读取的方式,如果你传递一个参数,当你试图读取它时,它会发出错误信号,例如9:00(测试 9:00) 中,阅读器甚至在宏开始运行之前就发出错误信号。

阅读器也是可定制的。不是让您以直接的方式将 9:00 读作 "9:00" 的方式,但是例如您可以编写一个简短的阅读器宏来阅读 @9:00 作为 "9:00" 或日期对象。

编辑:像这样的东西:

(defvar *arguments-rt* (copy-readtable ()))

(defun timestring-reader (stream char &optional count)
(declare (ignore char count))
(with-output-to-string (s)
(loop repeat 4 do (write-char (read-char stream) s))))

(set-macro-character #\@ #'timestring-reader () *arguments-rt*)

(let ((*readtable* *arguments-rt*))
(let ((args "dinner @9:00"))
(with-input-from-string (stream args)
(loop for arg = (read stream () ())
while arg collect arg))))

-> (DINNER "9:00")

关于macros - 反引号字符串插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30807729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com