clojure 用它的答案替换运算符

标签 clojure lisp

我正在尝试生成一个函数,该函数将表达式“tree”作为其参数,并返回具有相关计算值的树来代替运算符。

树的外观示例如下:

(* (+ 10 (* 4 9)) (- 6 10))

函数应该返回:

(-184 (46 10 (36 4 9)) (-4 6 10))

如果有人能为我提供一两个解决方案,并解释他们如何工作来为我指明正确的方向,那就太好了。

(def a '(* (+ 5 (* 3 7)) (- 6 8)) )

(defn evaltree [tree] (cons (eval (first (rest tree))) tree)) 

是我目前所拥有的。它评估列表的第一部分,但不会递归执行列表的其余部分,也不会替换运算符,它只会将值添加到开头。

最佳答案

当您想更新任意嵌套数据结构时,clojure.walk 中的函数很有用,以下解决方案似乎适用于这种情况。

(require '[clojure.walk :as w])

(defn op->answer [expr]
    (if (list? expr)
      (cons (eval expr) (rest expr))
      expr))

(w/prewalk op->answer '(* (+ 10 (* 4 9)) (- 6 10)))

;;=> (-184 (46 10 (36 4 9)) (-4 6 10))

clojore.walk/prewalk 对表达式树进行预序遍历,并用函数的返回值替换每个节点。您可以使用以下代码段查看订单或电话。

(w/prewalk #(do (println %) %) '(* (+ 10 (* 4 9)) (- 6 10)))

;; => prints the following 
(* (+ 10 (* 4 9)) (- 6 10))
*
(+ 10 (* 4 9))
+
10
(* 4 9)
*
4
9
(- 6 10)
-
6
10

关于clojure 用它的答案替换运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33709680/

相关文章:

clojure - 现实世界中的 Lisp

clojure - 运行时常量的 var 与atom

Clojure - (读取字符串字符串调用函数

hash - 在 Common Lisp 中使用字符串对象作为哈希键

recursion - 使用 Lisp 递归检查连续数字

random - 由 sbcl 编译的执行文件不能使随机或使打开文件工作

lisp - Atom 上是否有 Common Lisp 的 github markdown 语言标识符?

clojure - 嵌套的 dosync 调用的行为如何?

python - Clojure 相当于 Python 的 "any"和 "all"函数?

clojure - 从列表中使用 Noir 生成 img 标签