Lisp(「LISt Processing」の略)は、シンボルとリストの操作を中心にした独特の括弧ベースの構文を共有するプログラミング言語のファミリーです。Lispは、1950年代後半に最初に発明された最も古い高水準プログラミング言語の一つであり、数十年にわたって大きく進化してきました。Lispは、動的型付け、ガーベジコレクション、ファーストクラス関数などの強力な機能で特に知られており、AI研究、シンボリック計算、迅速なプロトタイピングに適しています。
Lispは、1958年にジョン・マッカーシーによってコンピュータプログラムのための数学的表記法として、またAIを実装するための実用的手段として創造されました。この言語は、数学的論理と計算機科学における形式的なシステムであるラムダ計算から派生しています。最初の実装はIBM 704で行われ、その後すぐに多くの方言が登場し、それぞれが独自の機能と複雑さを追加しました。
時間の経過とともに、Common LispやSchemeなどのいくつかの著名なLisp方言が登場しました。Common Lispは1980年代にさまざまな方言を統一するために標準化され、Schemeは関数型プログラミングとミニマリズムを強調し、学術界で人気を博しました。Lispの影響は、Clojure、Racket、さらにはPythonやRubyのような言語など、特に関数型プログラミングパラダイムをサポートする多くの現代のプログラミング言語に見られます。
今日、Lispは最も人気のあるプログラミング言語の中には含まれていませんが、特に研究、AI、教育の分野で影響力を持ち続けています。コミュニティは、Java仮想マシン(JVM)上で動作し、並行プログラミングに焦点を当てた新しい方言であるClojureを積極的に開発しています。
Lispは、括弧を使用して式を示す独自の構文を採用しており、コードはシンボリック表現(S式)で表されます。例えば:
(+ 1 2)
この式は、1と2の加算を表しています。
Lispの関数は、引数として渡したり、他の関数から返したり、変数に割り当てたりできます:
(defun square (x) (* x x))
(mapcar #'square '(1 2 3 4)) ; (1 4 9 16) を返す
Lispは動的型付けであり、変数は事前の宣言なしに任意のデータ型の値を保持できます:
(setq x 10) ; xは現在数値
(setq x "hello") ; xは現在文字列
Lispは、開発者がカスタム構文構造を作成できる強力なマクロシステムを特徴としています:
(defmacro when (condition &body body)
`(if ,condition
(progn ,@body))
)
if
およびcond
形式は、Lispにおける制御フローを容易にします:
(if (> x 0)
(print "Positive")
(print "Non-positive"))
Lispはリストを基本的なデータ構造として扱います:
(setq my-list '(1 2 3 4))
(car my-list) ; 1を返す
(cdr my-list) ; (2 3 4)を返す
関数はdefun
構文を使用して定義されます:
(defun factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
Common Lispには、Common Lispオブジェクトシステム(CLOS)として知られるオブジェクト指向システムが含まれています:
(defclass person ()
((name :initarg :name :accessor person-name)
(age :initarg :age :accessor person-age)))
(defmethod say-hello ((p person))
(format t "こんにちは、私の名前は~Aで、~A歳です。"
(person-name p) (person-age p)))
Lispは、handler-case
を使用した高度なエラーハンドリングメカニズムを提供します:
(handler-case
(/ 1 0)
(division-by-zero () (print "ゼロによる除算をキャッチしました!")))
いくつかの方言では継続がサポートされており、プログラムが実行状態を保存および復元できます:
(call-with-current-continuation
(lambda (k)
(k 10)))
いくつかの統合開発環境(IDE)やコンパイラがLispプログラミングに対応しています。人気のある選択肢には以下が含まれます:
Lispプロジェクトをビルドするには、通常「.lisp」または「.lsp」拡張子のファイルを作成します。SBCLを使用する場合、一般的なワークフローはREPLからプロジェクトをロードすることを含みます:
(load "my-project.lisp")
Quicklispというライブラリマネージャを使用するプロジェクトでは、依存関係を簡単に管理およびロードできます。
Lispは特に人工知能、シンボリック計算、学術界での応用で知られていますが、以下のような分野でも利用されています:
Lispはしばしば以下の言語と比較されます:
Lispから他の言語への翻訳は、しばしばソースからソースへの翻訳ツールを使用して行われます。例えば、以下のツールが存在します:
これらのツールはそれぞれ特定のマッピングを提供し、Lispのコア機能がターゲット言語で効果的に表現できるようにします。より複雑な翻訳には、特にマクロ最適化されたコードの場合、手動でのリファクタリングが必要になることがあります。