欢迎!请查看 关于 页面以获取更多关于这个工作方式的信息。
;;gets a list like (1 + (1 + 2)) ;;returns (+ 1 (+ 1 2)) (defmacro infix [expression] (letfn [(helper [expression] (cond (not (list? expression)) expression (= (count expression) 0) '() (= (count expression) 1) (recur (first expression)) (not (function? (first expression))) (let [a (first expression) op (second expression) b (nth expression 2)] (recur (cons (list op a b) (drop 3 expression)))) :else expression))] (helper expression))) (macroexpand '(infix (1 + 1 * 2 * 4))) ;; => ((+ 1 1) * 2 * 4) (macroexpand '(infix (((1))))) ;; => 1
第二次的 recur 似乎不起作用(在 (not (function? ....))。代码哪里出错了?
我认为这里可能存在几个与谓词相关的问题。对于第一个条件,我认为你可能想用比 list?(仅适用于列表集合)更广泛的东西,也许可以使用像 sequential? 这样包括序列的东西。我不确定 function? 是什么,但根据你的情况,那些将是符号,所以 symbol? 应该可以工作。我怀疑这就是你的当前问题,因为你没有看到这个分支。你可能会想在 cond 中添加一个 :else 分支来告诉你不匹配时的情况。
list?
sequential?
function?
symbol?
:else