programming-languages学习

programming-languages学习

1 最简单的数字表达式解析

实现加减表达式

(defn Const [i] (list :Const i))
(defn Negate [e] (list :Negate e))
(defn Add [e1 e2] (list :Add e1 e2))
(defn Multiply [e1 e2] (list :Multiply e1 e2))

(defn Const? [x] (= (first x) :Const))
(defn Negate? [x] (= (first x) :Negate))
(defn Add? [x] (= (first x) :Add))
(defn Multiply? [x] (= (first x) :Multiply))

(defn Const-int [e] (first (rest e)))
(defn Negate-e [e] (first (rest e)))
(defn Add-e1 [e] (first (rest e)))
(defn Add-e2 [e] (first (rest (rest e))))
(defn Multiply-e1 [e] (first (rest e)))
(defn Multiply-e2 [e] (first (rest (rest e))))

(defn eval-exp
  [e]
  (cond
    (Const? e) e
    (Negate? e) (Const (- (Const-int (eval-exp (Negate-e e)))))
    (Add? e) (let [v1 (Const-int (eval-exp (Add-e1 e)))
                   v2 (Const-int (eval-exp (Add-e2 e)))]
               (Const (+ v1 v2)))
    (Multiply? e) (let [v1 (Const-int (eval-exp (Multiply-e1 e)))
                        v2 (Const-int (eval-exp (Multiply-e2 e)))]
                    (Const (* v1 v2)))
    :else (throw (Exception. "eval-exp expected an exp"))))

(eval-exp (Add (Const 9) (Const 1)))
#'myrepl.core/Const#'myrepl.core/Negate#'myrepl.core/Add#'myrepl.core/Multiply#'myrepl.core/Const?#'myrepl.core/Negate?#'myrepl.core/Add?#'myrepl.core/Multiply?#'myrepl.core/Const-int#'myrepl.core/Negate-e#'myrepl.core/Add-e1#'myrepl.core/Add-e2#'myrepl.core/Multiply-e1#'myrepl.core/Multiply-e2#'myrepl.core/eval-exp(:Const 10)

作者: ntestoc

Created: 2018-12-28 Fri 11:11

猜你喜欢

转载自www.cnblogs.com/ntestoc/p/10189370.html
今日推荐