
2026/09/06 21:58
DOS で動作する Schemy Lisp
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
改善された要約:
SLED("Scheme Lisp en DOS")は、Kilo LISP から派生し、Scheme に着想を得た「Ur-Lisp」であり、FreeDOS、MS-DOS といった厳格な DOS 環境や DOSBox-X などのエミュレーター用に特別に設計されています。固定メモ制限(12,288 ノード)でリアルモード動作を行い、不変データ構造(ペア/cons セルとアトム)およびネイティブ数値型なしで自然数をシミュレートする独自のタリ記数体系を採用し、効率性を優先しています。このシステムは
inc、dec、zero? によって管理されます。16 ビットアーキテクチャにおけるスタックオーバーフローを防ぐため、SLED は関数(lambda や let など)に対してトランポリン評価機とテールコール最適化を採用しています。同言語は 8.3 ファイル命名規則(推奨拡張子 .scm)およびシンボルテーブルの文字制限 2048 文字といった歴史的制約を遵守し、記号は小文字 16 文字までとし、特定のエスケープ則が適用されます。同言語は未評価評価モデルを採用しており、クォートされていないデータはコードとして扱われ、エラー処理はトップレベルへジャンプして error? で確認可能であり、シャドウリング不可の不変コアライブラリを備えています。将来の開発計画は示されていませんが、SLED は厳格なリアルモード制約下での複雑な評価モデルを理解するための重要な教育ツールとして役立ち、現代ハードウェアではエミュレーターを通じて実行可能です。本文
SLED (Scheme LISP in DOS)
SLED(Scheme LISP in DOS)は、DOS(ディスクオペレーティングシステム)上で動作する純粋な記号的 LISt プロセッサ(LISP)です。Kilo LISP から派生し、Ur-Lisp の一部として機能します。FreeDOS や MS-DOS 本番、および DOSBox などの上でも実行可能です。
SLED の入手方法:
- リリース版ダウンロード(コンパイル済みバイナリを含む)
- ソースコードリポジトリ
- バックアップリポジトリ
データ構造
SLED は主に 2 つの基本的なデータ型、ペア(Pair)と原子(Atom)を持ちます。
記号 (Symbol)
一意の名前であり、以下の文字を最大 16 文字 の組み合わせで構成されます。
- 使える文字:
、a-z
、0-9
、-
、.
、?_ - 先頭制約:
で始まることはできません。. - エスケープ文字:
を使用すれば、印字不可能な ASCII 文字も記号の一部になります(例外:\
、(
、)
)。大文字は自動的に小文字に変換されます。'
例:
nil ; 特殊記号 sym! ; 名前付きの記号 (例) \ ; バックスラッシュ a-1_0 ; アルファベット、数字、記号的文字列
特殊記号 (Special Symbols)
システムが管理する定義済みの特殊記号です。
- 空リスト:
(最も重要)nil - 詳細はインデックスを参照してください。
引用 (Quote)
データとして宣言するには「評価しない」処理を行います。
- 明示的構文:
(quote sym) - 略法構文:
'sym
例:
(quote hello) ; → hello 'hello ; → hello
ペア (Pair)
頭(head)と尻尾(tail)を持つ構造体です。要素は不変です。
- ドット構文:
'(a . x) - 組み込み関数:
(cons 'a 'x)
例:
'(a . nil) ; (a) '(a . (b . nil)) ; (a b)
リスト (List)
尻尾が
nil で終わるペアの連続です。
- リストリテラル:
または'(a b)'() - 関数呼び出し:
(list 'a 'b)
例:
nil ; () '() ; nil '(a b) ; (a b) '(a b c) ; (a b c)
不規則リスト (Improper List)
nil で終わらず、ペアが途中から終了するリストです。
例:
(a . (b . (c . d)))
関連リスト (Association List / alist)
各要素がキーと値のペアであるリストです。
例:
((a . x) (b . y) (c . z))
- キー: ペアの頭部
- 値: ペアの尾部
S-Expression
S 式は、原子またはペアのいずれかで構成されるデータ構造です。データとしてもソースコードとしても利用されます。
数値
SLED にはネイティブの数値型はありませんが、リストを用いて自然数(計算記号)を表現します。
→ 0 (ゼロ)nil
→ 1(nil)
→ 2(nil nil)
→ 3(nil nil nil)
関連関数:
inc (加算), dec (減算), zero? (ゼロチェック)。
コードと評価
引用されていないデータはコードとして評価されます。
式 (Expressions)
評価可能な項目:
- バインディング (
)define - 関数 (
)lambda - 特殊形式 (
,if
など)quote
バインディング
(define a 'x) ; 'a という記号に 'x を結びつける
クロージャ(環境付き関数)
(define fun (lambda (arg1 arg2) (print arg1) (print arg2)))
関数適用
リストの最初を関数、残りを引数とします。
- 評価スタイル: **急進的 **(Eager)(引数は全て最初に評価される)。
例:
(fun arg1 arg2)
引数の受け取り方
→(lambda x ...)
はリスト全体として受ける。x
→(lambda (x y) ...)
,x
に分解する。y
→(lambda (x y . z) ...)
は残りのリスト(オプション引数)。z
再帰とスタック管理
- スタックオーバーフロー対策:
- Trampoline エバリュエーター
- **テールコール最適化 **(TCO)
,lambda
,let
,begin
,if
,ifnil
等で機能。apply
エラー処理
- エラー発生時はトップレベルへ戻り、再試行可能。
- 式内でのエラーキャッチは不可。
不変性とシャドウ化
- 特殊記号・特殊形式・組み込み関数・標準ライブラリの内容は変更不可能。
- これらはシャドウ化(隠蔽)できない。
システム環境
ファイル名
- DOS 8.3 規格に準拠(最大 8 文字 + ドット + 拡張子 3 文字)。
- 推奨拡張子:
(標準ライブラリ:.scm
)。sled.scm - インタープリターは拡張子を強制しない。
スタートアップ動作
起動時に自動的に標準ライブラリ (
sled.scm) を読み込みます。これに含まれる定義は不変です。
コマンドライン引数
sled には以下のような排他的な引数が存在します。
- ヘルプ表示:
C:\> sled /? - ソースファイル読み込みと REPL:
C:\> sled code.scm - バッチモード (実行後終了):
C:\> sled /B code.scm - エラー無視・続行:
C:\> sled /I code.scm
- パスの注意点: バックスラッシュ
はエスケープが必要。\- コマンド:
(実際は文字列内での表現)sled to\my\code.scm - 式内:
(load 'to\\my\\code.scm) - ファイルパスも 16 文字制限。
- コマンド:
REPL (リードル・エバル・プリント・ループ)
起動直後にインタラクティブモードが始まります。
- プロンプト:
sled> - 動作: 入力 → 評価 → 結果表示 → プロンプトへ戻る。
sled> (println 'hello _ 'world) hello world sled>
入力に関する注意点
- 拡張文字: 2 バイトの拡張文字(例:
)はエコーに問題を起こすため、避けるべきです。α
エンド処理 (終了方法)
- シンボル入力: トップレベルで特定の終了シンボルを入力。
- 関数呼び出し:
を評価。(exit)
コメント
- 行コメント:
で開始(改行まで無視)。; - ブロックコメント:
で囲む(括弧のバランスは必須)。(comment ...)
コード例
;;;; メインタイトル ;;; セクションタイトル ;; 行の開始 ; 行の終了 (comment this is ignored) ; OK (comment ( ) ; エラー: 括弧が合わない
システムコントロール
- 中断:
(計算停止)、CTRL+Break
(入力中断)。CTRL+C - ヘルプ: REPL で
を入力すると関数リストが表示されます。?
制限事項 (DOS アプリケーション)
- ヒープサイズ: ノード最大 12288。
- 記号表: 文字最大 2048。
- 標準ライブラリ自体が約 5% のリソースを消費します。
インデックス
特殊形式 (Special Forms)
定義や制御構文を提供するもの:
: バインディング作成define
: クロージャ作成lambda
: ローカルバインディング(単一のみ許可)let
/if
: 条件分岐ifnil
: 順序評価begin
/quote
: 引用'
: コメントcomment
標準ライブラリ関数一覧
以下に主要な機能を提供する関数がまとめられています。
基本データ操作
- リスト:
,(list ...)
,(cons ...)(append ...) - アクセス:
,(head ...)
((tail ...)
/car
の代替)cdr - テスト:
,atom?
,pair?
,empty?nil?
数値 (計算記号)
: リストに要素を追加(カウントアップ)inc
: リストから要素を削除(カウントダウン)dec
: 空リストかどうかの判定zero?
論理制御
- 条件:
,and?
(注意: 両方の引数を評価する二元関数)or? - 分岐:
,if
,ifnil
(not),when
(not)unless - 否定:
not
検索・代入
: 関連リストから値を取得(見つからない場合 nil)get
: 関連リストにキーと値を追加/更新put
: リスト内の要素を検索してサブリストを返すmember
/eq?
: 同一性・構造的等価性の判定equal?
関数操作
- 適用:
: リストの要素を展開して実行(apply fun args) - マッピング:
: リストに一元関数を適用(map fun lst) - パイプライン:
: 関数のチェーン化(compose arg fun1 ...)
入出力・環境
/print
: 標準出力表示println
: 入力行を読むread
: ファイルを読み込んで評価(最大 2 重ネスト可)load
: ガベージコレクションの実行gc
コントロールフロー
: エラー発生と中断error
/exit
: インタープリター終了quit
: インタプリターの再起動(定義を破棄)restart
: 匿名再帰の実装補助self
使用方法 (ビルド)
SLED は DOS 向けですが、Linux/Mac/Unix ではシェルスクリプト
./sled.sh を使用します。
ビルド環境
- Microsoft C コパイラー (MSC) または Open Watcom (OWC)
- Make ファイルを使用(
)addmake
コマンド例
# MS C 6.0A でビルド make build_msc # Open Watcom v2 でビルド make build_owc # ビルド後実行 make run # テストとベンチマーク make tests make bench ; Takeuchi 関数による性能測定
比較資料
他の MS-DOS ベースの LISP(Kilo LISP など)との比較や、実装詳細については関連リンクを参照してください。
ライセンス
このプロジェクトは **0BSD **(Zero-Clause BSD) ライセンスの下で提供されています。