Mathematica 終究不是 Lisp?

很多人都說 Mathematica 和 Lisp 很像,的確,從語言的特性來說,Mathematica 是屬於與 Lisp 同一類的語言,比如說 S-expression 列表結構以及函數式。但是,我最近發現有些 Mathematica 能做的在 Lisp 的方言里都不能做。比如說下面的模式匹配:

f[0] := 1

f[1] := 5

f[_] := 10

在 Lisp 里只能寫成:

(define (f x) (cond [(= x 0) 1] [(= x 1) 5] [else 10] ))

有沒有發現,醜陋許多了啊!用 match 寫也不好看。如果 Lisp 能允許重複使用 define,

允許下面這樣寫

(define (f 0) 1)

(define (f 1) 5)

(define (f _) 10)

那有多好!可惜是不允許的。更別說 Mathematica 里的雙下劃線、三下劃線這些

,這些在 Lisp 中都是沒有的。

所以,MMA 似乎某些方面比 Lisp 稍勝一籌。至少寫起模式匹配的程序來更舒服。


Lisp的方言很多,也有一些支持模式匹配的。

比如說傳說中的「神」語言(Shen),支持這樣的寫法:

(define f
0 -&> 1
1 -&> 5
X -&> 10)

不過它的模式匹配還是不如Mathematica強大。


模式匹配啊

你聽說過 Shen 語言嗎

在我自己的方言里也支持模式匹配,大概再過 21 天就寫好了(逃


haskell啊


racket支持模式匹配,詳情見王垠大大的解釋器教程~


要說 Lisp 一類的語言,Clojure 里有 case

(let [mystr "hello"]
(case mystr
"" 0
"hello" (count mystr)))

以及 Multimethod http://clojure.org/multimethods

(derive ::rect ::shape)

(defmulti bar (fn [x y] [x y]))
(defmethod bar [::rect ::shape] [x y] :rect-shape)
(defmethod bar [::shape ::rect] [x y] :shape-rect)


推薦閱讀:

Mathematica導入牆外網頁數據失敗,軟體內如何實現科學上網?
如何看待工科生因為現在數學軟體太強了,進而對數學不重視的觀念?
為什麼Mathematica的DSolve函數會解不出顯式解??
為什麼mathematica的語法和lisp很近?
Matlab 怎麼填充曲線相交的區域呢?

TAG:WolframMathematica | Lisp |