gpt4 book ai didi

macros - 定义一个宏来获取输入流

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

我正在尝试制作一个宏,该宏将采用输入流并根据读取的第一行内容执行不同的操作,然后读取进一步的输入。我在拥有一个接受输入流并从中读取一些值的宏时遇到了麻烦。

一个人为的例子:

(defmacro read-and-print (&optional in)
`(print
,(if (string= (read-line in) "greet")
`(concatenate 'string "hello" (read-line ,in))
`(read-line ,in))))

(with-input-from-string (in "greet
bob") (read-and-print in))

但即使这样也会产生以下错误

 There is no applicable method for the generic function
#<STANDARD-GENERIC-FUNCTION SB-GRAY:STREAM-READ-LINE (1)>
when called with arguments
(IN).
[Condition of type SB-INT:COMPILED-PROGRAM-ERROR]

真正让我感到困惑的是,即使将函数更改为第一行采用字符串也不起作用:

(defmacro read-and-print (command &optional in)
`(print
,(if (string= command "greet")
`(concatenate 'string "hello " (read-line ,in))
`(read-line ,in))))

(with-input-from-string (in "greet
bob")
(read-and-print (read-string in) in))

这给了我

 The value
(READ-LINE IN)
is not of type
(OR (VECTOR CHARACTER) (VECTOR NIL) BASE-STRING SYMBOL CHARACTER)
when binding SB-IMPL::STRING1
[Condition of type SB-INT:COMPILED-PROGRAM-ERROR]

虽然这执行得很好:

(with-input-from-string (in "greet
bob")
(read-and-print "greet" in))

我遗漏的 with-input-from-string 宏有什么特别之处吗?我怀疑我错过了一些关于宏的非常明显的东西,但谷歌搜索让我一无所获。

最佳答案

你问了什么

宏是一种代码生成工具。他们评估他们的论点。

您的 with-input-from-string 示例有效,因为字符串是自求值的。如果你比较字符串文字,你会得到一个错误。

你应该问什么

不需要在这里需要一个宏。请改用函数。

在函数和宏之间做出决定时,您需要问自己:

  • 我是否定义了新语法?
  • 代码是否生成更多代码?

除非您理解问题并回答,否则您应该使用函数。

另见 How does Lisp let you redefine the language itself?

关于macros - 定义一个宏来获取输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46955269/

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