1. 程式人生 > >programming-languages學習

programming-languages學習

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