プログラミング
Schemy Lisp En DOS
Schemy Lisp En DOS (sled.neocities.org)
要約
SLED (Schemy Lisp en DOS) は、Scheme に触発された純粋なシンボリックLISP処理系で、FreeDOSやMS-DOSなどのDOS環境で動作します。データ型としてペアとアトム(シンボル、クロージャ、特殊シンボル)を持ち、数値型はリストでエミュレートされます。コードはS式で記述され、関数呼び出しは評価が先行する形で、再帰が中心的な制御構造となります。DOSのファイル名規則やコマンドライン引数、REPLの操作方法についても説明されています。
全文翻訳
SLED (Schemy Lisp en DOS) について
SLED (Schemy Lisp en DOS) は、機能の多くがSchemeに触発された純粋なシンボリックLISP (LISt Processor) です。元々は素晴らしいKilo LISPから派生しましたが、マクロのような一部の機能は削減され、他の機能は強化されています。SLEDはUr-Lispに分類でき、FreeDOSやMS-DOSのようなDOS (Disk Operating System) 上、あるいはDOSBox、DOSBox-X、DOSBox-StagingのようなDOSエミュレータで動作します。提供されるシンボル、特殊形式、組み込み関数、標準ライブラリの概要についてはインデックスを参照してください。
SLEDを入手する: リリースダウンロード (コンパイル済みバイナリを含む) ソースコードリポジトリ バックアップリポジトリ
全体として、SLEDはDOSのためのLISPです。
データ
2つの基本的なデータ型があります: ペアとアトム (ペアではないもの)。アトムには3つのバリエーションがあります: シンボル、クロージャ (関数)、およびいくつかの特殊シンボル。
シンボル
シンボルは一意の名前であり、以下の文字の最大16個の任意の組み合わせで構成されます: a b c d e f g h i j k l m n o p q r s t u v w x y z 1 2 3 4 5 6 7 8 9 0 - . ? _ ただし、. は先頭文字にはできません。さらに、エスケープ文字 \(バックスラッシュ) でプレフィックスを付けると、任意の表示可能なASCII文字をシンボルの一部にできます。ただし、(,)、'、$ は除きます。This\ is\ a\ sym\! さらに、大文字も受け入れられますが、文字がエスケープされていない限り小文字に変換されます。
特殊シンボル
SLEDによって管理されるいくつかの事前定義された特殊シンボルがあります。例えば、nil は「空リスト」を意味します。詳細はインデックスを参照してください。
クォート
クォートは「評価しない」ことを意味します。クォート特殊形式を介してシンボルが登録されます: (quote sym)
便宜上、' の短縮構文を使用できます: 'sym
本質的に、クォートはコードではなくデータを宣言します。
ペア
ペアはヘッドとテールからなり、それぞれがアトムまたは別のペアのいずれかを含みます。ペアはドット . を使用してデータとして作成できます: '(a . x) または cons 組み込み関数の結果として作成できます: (cons 'a 'x)
ペアの要素 (ヘッドとテール) は不変です。
リスト
リストはペアのシーケンスであり、各テールは最後の1つを除いて別のペアを指します。最後のペアのテールは nil 値であり、() と同等です。以下にいくつかのリストを示します: nil '() '(a . nil) '(a . (b . nil))
リストは次のようにデータとしても作成できます: '(a b) または (標準ライブラリ) list 関数の結果として: (list 'a 'b)
不完全リスト
不完全リストは nil で終端しません。例: (a . (b . (c . d)))
連想リスト
連想リストは、各要素がペア (アソシエーション) であるリストです: ((a . x) (b . y) (c . z))
このようなペア要素のヘッド部分はキーと呼ばれ、テールは値と呼ばれます。
S式
シンボリック式 (S式) は、次のように定義されるデータ構造です: S式はアトムまたはS式のペアのいずれかです。Lisp、Scheme、特にSLEDでは、S式はデータとソースコードの両方に使用されます。
数値
SLEDシステムには数値型はありません。しかし、自然数 (非負整数) はリストを使用してエミュレートできます: '() ; ゼロ '(nil) ; 1 '(nil nil) ; 2 '(nil nil nil) ; 3
これらは基数記数法であり、基数 (カーディナリティ) が大きさを表します。これはフォン・ノイマン順序数に似ています。inc、dec、zero? 関数はカウントタスクを支援します。
コード
LISPでは、クォートされていないデータはコードとして評価されます。
式
式は次のように評価できます:
バインディング
関数
特殊形式
バインディング
バインディングはシンボルをデータペイロードにリンクし、define 特殊形式を介して作成されます: (define a 'x)
クロージャ
クロージャは環境とともに機能し、lambda 特殊形式の結果です: (define fun (lambda (arg1 arg2) (print arg1) (print arg2)))
関数適用
クォートされていないリストの最初の要素は関数に評価される式として解釈され、残りの要素はその関数への引数として解釈されます: (fun arg1 arg2)
関数評価は厳格です。まず、引数式が評価され、次に評価された引数を使用して関数適用が行われます。
引数
引数は評価され、値のリストとして関数に渡されます。これは、関数のパラメータがさまざまな方法で設定できることを意味します: (lambda x ...) ; x はリスト (lambda (x y) ...) ; 要素 x と y を持つデストラクチャードリスト (lambda (x y . z) ...) ; z はリスト (デフォルトでは nil)
オプション引数はリストとして渡すことができます。上記の z のように。
再帰
LISPs は、反復ではなく再帰に依存します。再帰とは、関数が自身を呼び出すことです。SLEDの2つの機能は、深い再帰でのスタックオーバーフローを回避するのに役立ちます: トランポリン評価器と末尾呼び出し最適化 (TCO)。TCOは、lambda、let、begin、if、ifnil、apply で機能します。さらに、再帰が2番目の引数で実行される場合、TCOは cons で機能します。
エラー
式の評価中のエラーはトップレベルにジャンプバックし、そこでエラー発生をテストできます。式内でエラーをキャッチすることはできません。
組み込み関数
SLED実行可能ファイルには、システムとの対話やコア機能を提供するための組み込み関数セットがあります。詳細はインデックスを参照してください。
標準ライブラリ
コア関数のセットを超えて、典型的な関数のセットが sled.scm ファイルに標準ライブラリとして実装されています。詳細はインデックスを参照してください。標準ライブラリは、追加のカスタム定義で拡張できます。
特殊形式
関数のように見えるが関数ではない特定の形式があります。これらは特殊形式と呼ばれ、関数の動作に従わず、関数と同じ構文を使用します。例えば、if は形式を解決する前に引数を評価しません。詳細はインデックスを参照してください。
不変性
特殊シンボル、特殊形式、組み込み関数、標準ライブラリの内容はSLEDでは不変です。さらに、特殊形式と組み込み関数はシャドウできません。標準ライブラリと隣接するカスタム定義は再定義できません。
システム
このLISPシステムはDOSアプリケーションです。
ファイル名
ファイル名はDOS 8.3命名規則に従う必要があります (ファイル名に最大8文字、ドット、ファイル拡張子に最大3文字)。このLISPで実行されるスクリプトの推奨ファイル拡張子は、Schemeとの構文的類似性から .scm です。例えば、標準ライブラリは sled.scm という名前です。ただし、インタプリタはファイル拡張子をチェックしません。
起動
sledが最初に行うことは、標準ライブラリをロードすることです。このライブラリは sled.scm という名前である必要があり、SLED.EXEインタプリタ実行可能ファイルと同じディレクトリにあると想定されます。標準ライブラリからロードされたすべてのシンボルとその値は不変になります。
コマンドライン引数
sledバイナリには、相互に排他的な4つのコマンドライン引数があります。最初の引数はヘルプページを表示します: C:\> sled /?
2番目の引数は、標準ライブラリロード後、REPL開始前にロードされるLispソースファイルへのパスです: C:\> sled code.scm
3番目は「バッチモード」スイッチ /B で、実行後に終了します: C:\> sled /B code.scm
4番目は「エラー無視」スイッチ /I で、/B と同様に動作しますが、エラー発生後も実行を続行します: C:\> sled /I code.scm
ファイルパスは最後の引数である必要があります。
ファイルパス
インタプリタでは、パスにバックスラッシュが含まれている場合、パスがシンボルになり、バックスラッシュ \ 単体では許容されるシンボル文字ではないため、エスケープする必要があります。C:\> sled to\my\code.scm (load 'to\\my\\code.scm)
ファイルパスも16文字の制限の対象となります。
REPL
sledが起動すると、read-eval-print-loop (REPL) がプロンプトで始まります: sled>
入力を読み込み、評価し、結果を表示し、再びプロンプトを表示します。さあ、楽しんでください: sled> (println 'hello _ 'world)
拡張文字
落とし穴は、サポートされていない拡張 (2バイト) 文字です。例として、REPLで矢印キーを使用すると、標準入力エコーに α (アルファ) が表示されます。これらの拡張文字は入力ストリームを汚染し、削除されても入力行でエラーを引き起こす可能性があります。
終了
sledを終了する通常のルートは2つあります。最初の方法はトップレベルのドル記号 $ で、パーサーに終了を指示します: sled> $
2番目は (exit) 組み込み関数で、評価されると終了します: (exit)
コメント