我是Clojure的新手,我无法理解它的报价系统.我正在写一个宏,我做了两个相似的案例 - 一个是有效的,另一个则没有.从某种意义上说,我只是试图用try/catch条件包围我的语句.
这是有效的代码:
(defmacro safe
[arg1 arg2]
(list 'let arg1 arg2)
)
Run Code Online (Sandbox Code Playgroud)
这是不起作用的代码
(defmacro safe
[arg1 arg2]
'(try
~(list 'let arg1 arg2)
(catch Exception e (str "Error: " (.getMessage e)))
)
)
Run Code Online (Sandbox Code Playgroud)
在~符号之后,它应该逃脱引号,但由于某种原因,它似乎没有.错误是:"无法解析符号:此上下文中的arg1 ......".
谢谢你的帮助!
编辑:
我用以下代码调用宏的代码:
(println (safe [s (new FileReader (new File "text.txt"))] (.read s)))
Run Code Online (Sandbox Code Playgroud)
另外,我导入这个:
(import java.io.FileReader java.io.File)
Run Code Online (Sandbox Code Playgroud)
目标是从文件中读取第一个符号,同时避免不正确的文本文件名.顺便说一句,这是我的学校作业,所以我不应该用任何其他方式来做这个,并且必须像这样调用宏,我知道with-open等等.