リスプ


オリジナルポストからKodumaro .

Lispは仕様ですJohn McCarthy , これは1958年からプログラミング言語族を始めた.それは基づいているλ-calculus , 形式システムAlonzo Church ’1930年代のs仕事、数字の代わりに象徴的なデータに対処するように設計されて、最も命令的な言語の標準.
LISPは「リスト処理」、リストは仕様メイン構造である.すべてのデータ-コード自体として-リストとして表されます.
例えば、1と2の合計
(+ 1 2)
要素のリストです+ , 1 , and 2 . このリストはcarcdr ( 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)))]))
ハッシュバンラインはどの言語ラケットを扱うかを指示します.
  • R⁵RS#!r5rs
  • R⁶RS#!r6rs
  • PLT :#!racket
  • 怠惰なラケット#!lazy
  • C#!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))