リスプ
12356 ワード
オリジナルポストからKodumaro .
Lispは仕様ですJohn McCarthy , これは1958年からプログラミング言語族を始めた.それは基づいているλ-calculus , 形式システムAlonzo Church ’1930年代のs仕事、数字の代わりに象徴的なデータに対処するように設計されて、最も命令的な言語の標準.
LISPは「リスト処理」、リストは仕様メイン構造である.すべてのデータ-コード自体として-リストとして表されます.
例えば、1と2の合計
頭はラムダ関数、そしてテールはパラメータを表します.この場合、関数は
Lispファミリー最も重要な言語はCommon Lisp , Emacs LISP , Scheme , and Clojure .
つのLisp言語の階乗実装を見てみましょう.最初に一般的なLisp
スキームは、さまざまな実装だけでなく、異なる言語の変化も、Lotta異なるバリエーションと、家族そのものになっている.
その最も重要なバリエーションはGuile , MIT Scheme , and Racket (以前はPLTスキーム).
ラケットはいっぱいだRAD プラットフォームには、IDEDrRacket , WYSIWYGインタフェースビルダーMrEd Designer , とPLTインタプリタ.
インタプリタR⁵RS , R⁶RS , PLT , Lazy Racket , さらにC .
例えば、ラケットの要因
R⁵RS R⁶RS PLT : 怠惰なラケット C
アキュムレータは、スタックオーバーフローを扱うための関数型プログラミングパターンですtail-call optimisation (tco)
再び階乗を取りましょう:ステップは、前任者の階乗の現在の価値回と定義されますストップはゼロの階乗です.
それを可能にするアキュムレータ駆動機能が存在しなければならない
巨大な計算データ量を扱う最も効率的な方法はlazy evaluation , または必要に応じて呼び出します.Haskell , 例えば、要求によって呼び出しを評価するだけで、無限のリストを構築できます.
Lazy Racket Haskellと同様の評価で、評価を遅らせる約束をしています.
関数による遅延関数の評価
それで、怠惰な要因は以下の通りです.
Lispは仕様ですJohn McCarthy , これは1958年からプログラミング言語族を始めた.それは基づいているλ-calculus , 形式システムAlonzo Church ’1930年代のs仕事、数字の代わりに象徴的なデータに対処するように設計されて、最も命令的な言語の標準.
LISPは「リスト処理」、リストは仕様メイン構造である.すべてのデータ-コード自体として-リストとして表されます.
例えば、1と2の合計
(+ 1 2)
要素のリストです+
, 1
, and 2
. このリストはcar
頭cdr
( tail )関数(+ . (1 2))
car
and cdr
are IBM 704 LISPが最も開発されたシステム.CARは「レジスタ番号のアドレス部の内容」、CDRは「レジスタ番号のデクリメント部分の内容」を意味する頭はラムダ関数、そしてテールはパラメータを表します.この場合、関数は
'+
, を返します.Lispファミリー最も重要な言語はCommon Lisp , Emacs LISP , Scheme , and Clojure .
つのLisp言語の階乗実装を見てみましょう.最初に一般的なLisp
(defun factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
インR⁵rs(scheme)(define factorial
(lambda (n)
(if (zero? n)
1
(* n (factorial (- n 1))))))
クロジュールで(defn factorial [n]
(reduce * (range 1 (inc n))))
スキーム
スキームは、さまざまな実装だけでなく、異なる言語の変化も、Lotta異なるバリエーションと、家族そのものになっている.
その最も重要なバリエーションはGuile , MIT Scheme , and Racket (以前はPLTスキーム).
ラケットはいっぱいだRAD プラットフォームには、IDEDrRacket , WYSIWYGインタフェースビルダーMrEd Designer , とPLTインタプリタ.
インタプリタR⁵RS , R⁶RS , PLT , Lazy Racket , さらにC .
例えば、ラケットの要因
!#racket
(define factorial
(λ (n)
[if (zero? n)
1
(* n (factorial (- n 1)))]))
ハッシュバンラインはどの言語ラケットを扱うかを指示します.#!r5rs
#!r6rs
#!racket
#!lazy
#!planet jaymccarthy/c
アキュムレータ
アキュムレータは、スタックオーバーフローを扱うための関数型プログラミングパターンですtail-call optimisation (tco)
再び階乗を取りましょう:ステップは、前任者の階乗の現在の価値回と定義されますストップはゼロの階乗です.
n! = n × (n-1)!
0! = 1
上記のPLT実装を見ると、最後の呼び出しID'*
; TCOを有効にするにはfactorial
.それを可能にするアキュムレータ駆動機能が存在しなければならない
factorial
になります.(define factorial
(λ (n)
*factorial* n 1))
アキュムレータ駆動バージョン*factorial*
) 元のパラメータとアキュムレータを受け取り、アキュムレータを停止したときに返します.(define *factorial*
(λ (n acc)
[if (zero? n)
acc
(*factorial* (- n 1) (* acc n))]))
今最後の呼び出しは*factorial*
, TCOの利用遅延評価
巨大な計算データ量を扱う最も効率的な方法はlazy evaluation , または必要に応じて呼び出します.Haskell , 例えば、要求によって呼び出しを評価するだけで、無限のリストを構築できます.
fib :: [Integer]
fib = 1 : 1 : zipWith (+) fib (tail fib)
Onよりも多くの要素が必要です.take 10 fib
約束する
Lazy Racket Haskellと同様の評価で、評価を遅らせる約束をしています.
関数による遅延関数の評価
'!!
.それで、怠惰な要因は以下の通りです.
#!lazy
(provide factorial)
(define *factorial*
(λ (n acc)
[if (zero? n)
acc
(*factorial* (- n 1) (* acc n))]))
(define factorial
(λ (n)
(*factorial* n 1)))
そして、それを呼び出すことで評価できます.(!! [map (λ (n) `(,n ,(factorial n))) '(0 1 2 3 4 5)])
結果は以下の通りです:'((0 1) (1 1) (2 2) (3 6) (4 24) (5 120))
Reference
この問題について(リスプ), 我々は、より多くの情報をここで見つけました https://dev.to/cacilhas/lisp-473jテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol