【问题标题】:How to pass s-exp to parameter of non s-exp type in Common Lisp?如何将 s-exp 传递给 Common Lisp 中非 s-exp 类型的参数?
【发布时间】: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


    【解决方案1】:

    您缺少报价的基础知识。你的表情

    ? `(("123" "456")) ; quasiquote
    (("123" "456"))
    

    是一个包含列表的列表,也可以使用函数LIST as 来创建

    ? (list (list "123" "456")) ; list
    (("123" "456"))
    

    要使用表达式,您可以使用取消引号(注意前面的逗号)

    ? `((,(first line) ,(second line))) ; quasiquote with unquote
    (("123" "456"))
    

    或者,更好

    ? `(,line)
    (("123" "456"))
    

    或使用list

    ? (list line)
    (("123" "456"))
    

    【讨论】:

    • 谢谢,这行得通。我应该把逗号放在前面。在此之前我也考虑过放逗号,但我只是把它放在一个(不正确的)宏中,所以我自己更加困惑......现在我也看了lispworks.com/documentation/HyperSpec/Body/02_df.htm,反引号参数是eql。到 (追加 (list (list (first s) (second s))) '() )。当我稍后看到你的答案时,我看到了更清晰的语法。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2011-07-26
    • 2017-02-13
    • 2012-12-21
    • 1970-01-01
    • 2020-11-11
    • 2020-07-12
    相关资源
    最近更新 更多