fact :: Integer -> Integer
fact 0 = 1
fact n = n * fact (n - 1)
(defn fact (-> Integer Integer)
((0) 1)
((n) (* n (fact (- n 1)))))
機能 | Lisp | Hasp | Haskell |
---|---|---|---|
リスト構造書き下しやすさ | ◎S式! | ◎Lispと同じ | △「,」で区切る必要あり |
tuple等の非リスト構造書き下しやすさ | ○方言、処理系にもよるが標準ではなし、リーダーマクロで! | △「(tup 1 2)」がHaskellでの「(1, 2)」相当、等々。リーダーマクロなし | ◎普通に書ける |
機能 | Lisp | Hasp | Haskell |
---|---|---|---|
リスト内包、ガード記法 | ○標準ではなし、マクロで! | ○Haspとしては対応記法なし。Lispと同じように独自でマクロ組むか、「:hs」を使ってHaskell表記で書いてしまう | ◎標準装備 |
メタプログラミング | ○マクロで。歴史あり枯れているが型なし、デバッグ大変 | △マクロで。Schemeで書く。特定ファイルに書く等の制約あり | ◎Template Haskell。型あり安全だがマクロ以上に習熟が必要。枯れてなく、仕様変更される事あり |
機能 | Lisp | Hasp | Haskell |
---|---|---|---|
誰の為の文法か | ソースコードはデータ構造。コンピュータが読み書きしやすい | Lispと同じ | 人間が読み書きしやすいように仕様が非常に練られている |
型などによる特性 | 方言、処理系にもよるが基本は動的型。実働環境のプロセスの中に手をつっこんでプロセスを停止させずにアルゴリズム変更等が可能 | Haskellそのもの | 静的型、型推論などによって、ソースコード読み込み時(またはコンパイル時)に非常に強力なチェックを行ってもらえる |
ご閲覧ありがとうございました