![]() | |
| パラダイム | マルチパラダイム:関数型、手続き型、メタ、オブジェクト指向 |
|---|---|
| 家族 | リスプ |
| 初登場 | 1990年 |
| プレビューリリース | 0.991 [1]
/ 2010 |
| タイピングの規律 | 強い、ダイナミックな |
| 範囲 | 静的と動的 |
| OS | リナックス |
| ファイル名拡張子 | .em |
| 主な実装 | |
| EuXLisp、[2] Youtoo、[2] Eu2C [2] | |
| 影響を受けた | |
| Common Lisp、InterLisp、LeLisp、Lisp/VM、Scheme、T、CLOS、ObjVlisp、Oaklisp、MicroCeyx、MCS、Standard ML、Haskell | |
| 影響を受けた | |
| ディラン、ISLISP、エヴェリン | |
EuLisp は、ヨーロッパ各地の産業界および学術界の Lisp ユーザーと開発者の緩やかな組織によって開発された、静的および動的スコープの Lisp方言です。標準化者たちは、( Common Lispと比較して) 「過去に縛られていない」、そしてSchemeほどミニマリストではない新しいLisp を作成することを意図していました。もう 1 つの目的は、オブジェクト指向プログラミングパラダイムを適切に統合することでした。これは、第 3 世代のプログラミング言語です。
起源
言語定義のプロセスは、1985 年にパリで行われた会議で始まり、数年かかりました。完全な仕様と最初の実装 (解釈のみ) は 1990 年に利用可能になりました。
特徴的な機能
主な特徴は、Lisp-1 (関数と変数の別々の名前空間がない) であること、The EuLisp Object System (TELOS) というCommon Lisp Object System (CLOS) スタイルの汎用関数型オブジェクト指向システムが基礎から統合されていること、モジュール システムが組み込まれていること、小型の組み込みハードウェアや教育用マシンでの Lisp の使用を促進するためにレイヤーで定義されていることです。継続をサポートしていますが、 Schemeほど強力ではありません。シンプルで軽量なプロセス メカニズム (スレッド) を備えています。
まとめ
- レベルごとの定義。現在はレベル0とレベル1です。
- (非ファーストクラスの)語彙環境に基づくモジュール。
- 語彙的にスコープ指定され、レベル 1 では動的バインディングまたは遅延バインディングが使用可能です。
- 関数名と変数名のための単一の名前空間 ( Schemeなど)。
- 軽量プロセス。
- レベル 0 で単一継承、レベル 1 で多重継承とメタオブジェクト プロトコルを備えた完全に統合されたオブジェクト システム。
- オブジェクト指向の 条件システム。
実装
EuLispの初期の実装は、Free and Evenuous Eulisp (FEEL)でした。FEELの後継は、イギリスのバース大学によるYoutoo (インタープリタ版とコンパイル版)でした。[3] EuLispの基本レベルであるレベル0のインタープリタは、David Michael BetzによるSchemeの実装であるXSchemeでRussell Bradfordによって書かれました。元々はEuScheme EuSchemeという名前でしたが、最新バージョンは混乱を避けるためにEuXLisp [1]に改名されています。また、EuLisp最適化コンパイラであるEu2C [2]は、ドイツのAPPLYプロジェクトの下でFraunhofer ISSTによって作成されました[3]。
EuLisp の方言が開発され、Plural EuLisp という名前が付けられました。これは、並列コンピューティングプログラミング拡張機能を備えた EuLisp でした。
例
「ハノイの塔」問題を解決するためのアルゴリズムでのクラスの使用例。
( defmodule hanoi (構文(構文-0 )インポート(レベル-0 )エクスポート( hanoi ))
;;;-------------------------------------------------
;;; タワーの定義
;;;-------------------------------------------------
( defconstant *max-tower-height* 10 )
( defclass <tower> () (( idリーダー: tower-idキーワード: id: ) (ブロックアクセサ: tower-blocks )))
( defun build-tower ( x n ) ( labels (( loop ( i res ) ( if ( = i 0 ) res ( loop ( - i 1 ) ( cons i res ))))) (( setter tower-blocks ) x ( loop n ())) x ))
( defmethod generic-print (( x <tower> ) ( s <stream> )) ( sformat s "#<tower ~a: ~a>" ( tower-id x ) ( tower-blocks x )))
;;;-------------------------------------------------
;;; タワーブロックへのアクセス
;;;-------------------------------------------------
( defgeneric push ( x y ))
( defmethod push (( x <tower> ) ( y <fpi> )) ( let (( blocks ( tower-blocks x ))) ( if ( or ( null? blocks ) ( < y ( car blocks ))) (( setter tower-blocks ) x ( cons y blocks )) ( error <condition> ( fmt "サイズ ~a のブロックをタワー ~a にプッシュできません" y x )))))
( defgeneric pop ( x ))
( defmethod pop (( x <tower> )) ( let (( blocks ( tower-blocks x ))) ( if block ( progn (( setter tower-blocks ) x ( cdr blocks )) ( car blocks )) ( error <condition> ( fmt "cannot pop block from empty tower ~a" x )))))
;;;-------------------------------------------------
;;; x3 をバッファとして使用して、タワー x1 からタワー x2 に n ブロックを移動します
;;;-------------------------------------------------
( defgeneric move ( n x1 x2 x3 ))
( defmethod move (( n <fpi> ) ( x1 <tower> ) ( x2 <tower> ) ( x3 <tower> )) ( if ( = n 1 ) ( progn ( push x2 ( pop x1 )) ( print x1 nl x2 nl x3 nl nl )) ( progn ( move ( - n 1 ) x1 x3 x2 ) ( move 1 x1 x2 x3 ) ( move ( - n 1 ) x3 x2 x1 ))))
;;;-------------------------------------------------
;;; 「ハノイの塔」を初期化して実行します
;;;-------------------------------------------------
( defun hanoi () ( let (( x1 ( make <tower> id: 0 )) ( x2 ( make <tower> id: 1 )) ( x3 ( make <tower> id: 2 ))) ( build-tower x1 *max-tower-height* ) ( build-tower x2 0 ) ( build-tower x3 0 ) ( print x1 nl x2 nl x3 nl nl ) ( move *max-tower-height* x1 x2 x3 )))
(ハノイ)
;;;-------------------------------------------------
) ;; モジュール hanoi の終了;;;-------------------------------------------------
参考文献
- ^ 「Eulisp」(PDF) . GitHub . 2012年3月6日時点のオリジナル(PDF)からアーカイブ。 2017年9月20日閲覧。
- ^ abc "Eulisp". GitHub .
- ^ Kind, Andreas. 「Youtoo」. 数学科学部.バース大学. イギリス. 2018年10月28日閲覧。
- 「EuLisp の概要」、Julian Padget、Greg Nuyens、Harry Bretthauer 編。LISPおよびシンボリック計算、第 6 巻、第 1-2 号、1993 年、9 ~ 98 ページ。
- 「EuLisp メタオブジェクト プロトコルのバランス」、Harry Bretthauer、Jürgen Kopp、Harley Davis、Keith Playford。LISPおよびシンボリック計算、第 6 巻、第 1 ~ 2 号、1993 年 8 月、119 ~ 138 ページ。
- 「EuLisp の教育への応用」、R. Bradford および DC DeRoure。LISPおよび記号計算、第 6 巻、第 1-2 号、99 ~ 118 ページ。
- 「Telos のアプリケーション」、Peter Broadbery、Christopher Burdorf。LISPおよびシンボリック計算、第 6 巻、第 1 ~ 2 号、1993 年 8 月、139 ~ 158 ページ。
- 「EuLisp の型推論への実践的アプローチ」、Andreas Kind および Horst Friedrich。LISPおよび記号計算、第 6 巻、第 1 ~ 2 号、1993 年 8 月、159 ~ 176 ページ。
- 「EuLisp スレッド: 並行処理ツールボックス」、Neil Berrington、Peter Broadbery、David DeRoure、Julian Padget。LISPおよびシンボリック計算、第 6 巻、第 1 ~ 2 号、1993 年 8 月、177 ~ 200 ページ。
- 「Plural EuLisp: プリミティブ シンボリック データ並列モデル」、Simon Merrall、Julian Padget。LISPおよびシンボリック計算、第 6 巻、第 1 ~ 2 号、1993 年 8 月、201 ~ 219 ページ。
- 「EuLisp から ASM/C コンパイラー用の保守的なガベージ コレクター」、E. Ulrich Kriegel。OOPSLA'93ワークショップ、ガベージ コレクションとメモリ管理、ワシントン DC、1993 年 9 月 27 日。
- 「Common Lisp での Telos の実装」Wayback Machineに 2006-02-14 にアーカイブ、オブジェクト指向システム、第 3 巻、31 ~ 49 ページ、1996 年。ISSN 0969-9767。
外部リンク
- EuLisp FAQとリンク
- 1993 年の最終仕様のバージョン .99 – ( PDF )
- バージョン .991 2012-03-06 にWayback Machineにアーカイブ非公式更新ドラフト定義 (2010) – ( PDF )
- EuScheme ソース
- GitHubの EuLisp 、最新バージョン: EuLisp (64 ビット サポートなど)、EuXLisp、Eu2C

