【发布时间】:2014-08-25 05:00:31
【问题描述】:
问题:如何在传递给期望字符串类型或其他参数的函数之前强制评估 s-exp。
这段代码很好(没有错误):
(setf (slot-value (ole sheet :range "A1:B1") 'value)
`(("123" "456"))))
但是,当传递诸如 (first line) 而不是“123”之类的 s-exp 时:
(setf line '("123" "456"))
(setf (slot-value (ole sheet :range "A1:B1") 'value)
`(((first line) (second line)))))
有错误信息:
值 FIRST 不是预期的类型(或 细绳 FIXNUM 单浮子 双浮动)。 [TYPE-ERROR 类型条件]
重启: 0:[RETRY] 重试 SLIME REPL 评估请求。 1: [*ABORT] 返回 SLIME 的顶层。 2:[ABORT-BREAK] 重置此线程 3: [ABORT] 杀死这个线程
我知道问题出在哪里。但是有没有办法摆脱这个限制?因为我们需要将这行代码放在一个循环中,所以不能将参数值固定为例如“123”...
我尝试使用宏:
(defmacro set-line (par1 par2)
`(setf (slot-value (ole sheet :range "A1:B1") 'value)
`((,par1 ,par2))))
但是,它不起作用。仍然是相同的错误消息说错误的类型(第一行)...
(set-line (first line) (second line))
如果反引号 ` 出现在宏体内,我也不知道如何转义它。我试过在宏体内的反引号前面放一个 \ ,但是 \ 也会出现在宏展开时。
`(setf xxx ` <--- another backquote
`(setf xxx \` <--- this can't escape backquote inside macro body
谢谢。
背景:在玩 Win32 OLE Excel 示例时: https://github.com/quek/cl-win32ole/blob/master/example/excel.lisp
【问题讨论】:
标签: common-lisp