
2026/09/06 21:58
DOS 用の Schemy Lisp
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
SLED(Schemy Lisp en DOS)は、Scheme を灵感とする記号 Lisp 方言であり、元々は Kilo LISP から派生したもので、マクロ機能を強化されたものです。本システムは、レガシーな DOS システム(FreeDOS、MS-DOS など)および DOSBox-X、DOSBox-Staging、DOSBox などの現代的なエミュレータに特化して設計されており、現代のオペレーティングシステムを必要とせずにアンティークハードウェアやコンシューマーマシン上で実行可能となります。SLED は S 式表現をデータとコードの両方として扱い、数字には tally numeral を、
lambda クロージャを用い、let、if、cons などの特定の形式に対して eager evaluation と tail-call 最適化を実装しています。動作は厳格な制約の下で行われ、固定されたヒープ制限(ノード数 12288)、シンボルテーブル容量(文字数 2048)、DOS の 8.3 ファイル命名規則への準拠(例:スクリプト用.scm拡張子)が適用されます。プログラミングにはリポジトリから取得されたコンパイル済みバイナリとソースコードをサポートしており、組み込み関数、標準関数とは区別される特殊形式、不変のコアを備えています。ユーザはコマンドラインよりソースファイルをロードし、バッチモード(/B)やエラー無視実行(/I)などのオプションを利用でき、(exit) で終了させ、エラー発生時に式内部で捕捉されずトップレベルにジャンプするエラー処理を行います。コメントはセミコロン(;)で示し、ブロックコメントは括弧の一致を要求します。本文
Schemy Lisp en DOS (SLED) 日本語版ガイド
概要
SLED (Schemy Lisp en DOS) は、Scheme の機能を基盤とした純粋な記号的 LISt プロセッサです。優れた Kilo LISP を源流としつつ、マクロなどの機能は削減しつつも他の機能を強化した「Ur-Lisp」に分類されます。
- 動作環境: FreeDOS や MS-DOS などの DOS 上で動作します。
- エミュレーター対応: DOSBox, DOSBox-X, DOSBox-Staging などに対応しています。
- 入手方法: リリースダウンロード(コンパイル済みバイナリ)、ソースコードリポジトリ、バックアップリポジトリが用意されています。
データ型と構造
SLED では2 つの基本的なデータ型が存在します:ペアと**非ペア(アトム)**です。
記号 (Symbol)
一意の名称であり、以下の文字を最大 16 個組み合わせることができます。
- 使用可能な文字:
〜a
,z
〜0
,9
,-
,.
,?_ - 制約: 先頭文字として「.` (ドット) を使用することはできません。
- エスケープ: バックスラッシュ
を用いて、任意の可印 ASCII 文字(\
を除く)を記号に含めることができます。( ) ' $; 例:括弧を含む記号 This\ is\ sym\! - ケース: 大文字と小文字を受け入れ、エスケープされていない場合は小文字に変換されます。
クオート (Quote)
「評価しない」意味を持ち、データ宣言に使用されます。
- 標準構文:
(quote sym) - 簡略構文:
'sym
ペア (Pair)
ヘッドとテールを持ち、それぞれアトムまたは別のペアを保持します。要素は不変です。
- ドット構文:
'(a . x) - 関数構文:
(cons 'a 'x)
リスト (List)
テールが別のペアを指し、最後のものは
nil(空リスト)である構造です。
- 例:
,nil
,'()
,'(a . nil)'(a . (b . nil))
- 作成方法:
'(a b) ; 簡易構文 (list 'a 'b) ; 標準ライブラリ関数
不適切なリスト (Improper List)
nil で終わらず、ペアのテールが別の記号などの非リスト構造になっているものです。
(a . (b . (c . d)))
アソシエイションリスト
キーと値のペアの序列です。
((a . x) (b . y) (c . z)) ; キー: a, b, c ... / テール (値): x, y, z ...
数値 (Natural Numbers)
システム固有の数値型はありませんが、リストを用いて**自然数(非負整数)**をシミュレートできます(Tally Numerals)。
- 例:
; ゼロ'()
; 一'(nil)
; 二'(nil nil)
; 三'(nil nil nil)
- 操作関数:
,inc
,dec
を使用します。zero?
S-式 (S-expression)
「アトムまたは S-式のペア」から定義されるデータ構造です。ソースコードとしても、データとしても機能します。
コードと評価
LISP において、クオートされていないデータはコードとして評価されます。
基本要素
- バインディング:
を用いて記号をデータにリンクします。define(define a 'x) - クロージャ:
で関数と環境を作成します。lambda(define fun (lambda (arg1 arg2) (print arg1) (print arg2))) - 関数の適用: クオートされていないリストの頭が関数、残りが引数とみなされます。
; 厳密(eager)評価:まず引数を評価し、次に適用する (fun arg1 arg2)
引数の受け取り方
関数のパラメータはリストとして渡され、以下の方法で処理可能です。
;(lambda x ...)
はリスト全体x
; リストの先頭 2 つ要素を分解(lambda (x y) ...)
;(lambda (x y . z) ...)
は残りのリスト(デフォルト nil)z
再帰とスタック管理
LISP は再帰に頼ります。SLED は以下の機能で深層再帰時のスタックオーバーフローを防ぎます。
- トランポリン評価子 (Trampoline Evaluator): 再帰的な呼び出しを非再帰的に処理します。
- 尾再帰最適化 (TCO):
,lambda
,let
,begin
,if
,ifnil
で機能します。apply- 第 2 引数に再帰が行う場合は
でも機能します。cons
エラー処理
- エラー発生時はトップレベルに戻ります。
- 式内部でのエラーキャッチはできません(トップレベルのみ検出可能)。
特殊形式と関数
- 特殊形式:
など、引数を全て評価しない形式です。関数とは動作が異なります。if - 組み込み関数: システム連携用機能。
- 標準ライブラリ:
に実装されており、カスタム定義を拡張可能です。sled.scm - 不変性: 特殊記号、特殊形式、組み込み関数、標準ライブラリの内容は変更・シャドウ化できません。
システムと実行環境
ファイル命名規則
- DOS 8.3 形式に従う必要があります(ファイル名 8 文字 + ドット + 拡張子 3 文字)。
- スクリプトには
を推奨します(Scheme と構文が似ているため)。.scm - インタープリタは拡張子を厳密にチェックしません。
起動時の動作
- まず標準ライブラリ (
) を読み込みます。sled.scm - 読み込まれる記号と値は不変となります。
- その後、REPL (Read-Eval-Print Loop) が開始されます。
sled>
コマンドライン引数
以下の 4 つの選択肢があります(最後の引数がファイルパス)。
| 引数 | 説明 | 例 |
|---|---|---|
| ヘルプページを表示 | |
| (省略) | 標準ライブラリ読み込み後、REPL を開始 | |
| バッチモード: スクリプト実行後に終了 | |
| エラー無視モード: エラー後も実行を続行 | |
ファイルパスのエスケープ
- パス内のバックスラッシュ
はエスケープする必要があります(記号文字として許容されないため)。\; コマンドライン C:\> sled to\my\code.scm ; 内部での読み込み処理 (load) (load 'to\\my\\code.scm) - ファイルパスも 16 文字の制限があります。
REPL と拡張文字
- 方向キー: 「α」などの拡張文字が表示されることがあります。これらは入力ストリームを汚染し、エラーの原因となりますので避けてください。
- 終了方法:
- トップレベルで
を入力(パーサーが終了指示)。$sled> $ - 組み込み関数
を評価する。(exit)(exit)
- トップレベルで
コメントと制御
- 行コメント:
で開始。次の行までの無視。;; メンテナンス用コード ;; 再定義禁止領域 ;; 注意:重要な設定です - ブロックコメント:
特殊形式を使用。括弧のバランスが必要。comment(comment ()) ; OK ; '(comment test) ; エラー(クオート不可) - 中断/終了:
- 入力を中断:
CTRL+C - 計算を終了:
CTRL+Break
- 入力を中断:
ヘルプ表示
REPL で
? を入力すると、特殊形式や組み込み関数のリストを表示できます。
リストと数値の制限事項 (Real Mode DOS)
DOS アプリケーションとしての制約があります。
- ヒープサイズ: 最大 12,288 ノード
- 記号テーブル: 最大 2,048 文字
- 標準ライブラリ: 約 5% の資源を消費します。
インデックスと辞書
特殊形式
,define
,lambda
,let
,if
,ifnil
,apply
,load
など。comment
組み込み関数 (ビナリー・ユニ ary)
- 論理:
: 両方が真か(バイナリ)。and?
: 少なくとも一つが真か(バイナリ)。or?
: 否定(not
のエイリアス)。empty?
- リスト操作:
: 新規ペア作成。cons
: 後続要素取得(古典的 LISP のtail
に相当)。cdr
: リスト連結。append
: リスト反転。reverse
,list
,map
,member
,get
,put
。value
- 制御:
: 順次評価。begin
: 条件分岐(nil かどうか)。ifnil
: エラー発生 (error
ステータスへ)。err
: インタープリタ再起動(定義全削除)。restart
述語・サンク・エイリアス
- 型判定:
,symbol?
,atom?
,list?
,pair?
。defined?
,true
: 真理値用。nil
- 数値判定:
,zero?
,inc
: Tally 数操作。dec
- 比較:
: 再帰的等価性(構文等価)。equal?
: アトム間・浅い等価性(内容等価)。equiv?
- ファイル:
,eof?
: 読み込み操作。read
特殊記号と定数
: REPL 終了。$
: ヘルプ表示。?
: クオート。'
: 空白文字。_
: トップレベル結果。ans
: エラー状態フラグ。err
,nil
: 真理値。true
: バージョン情報。ver
ビルドと実行
環境要件
ビルドには Microsoft C コンパイラ または Open Watcom、および make が必要です。
ビルドコマンド
コンパイル器の場所(
MSC または OWC)を指定して以下のコマンドを実行します。
- MS C 6.0A でビルド:
make build_msc - Open Watcom v2 でビルド:
make build_owc
実行テスト
- ビルド実行確認:
make run - テストスイート実行:
make tests - ベンチマーク実行 (Takeuchi 関数):
make bench
プラットフォームごとの使用方法
SLED は主に DOS 環境向けですが、他の OS では以下の方法で利用可能です。
| 環境 | 実行方法 |
|---|---|
| FreeDOS / MS-DOS | バイナリを直接起動します。 |
| Linux, BSD, MacOS, Unix | シェルスクリプト を実行(自動で DOSBox が選択されます)。 |
| エミュレーター | DOSBox, DOSBox-X, DOSBox-Staging 上で動作します。 |
ライセンス
このプロジェクトは 0BSD (ゼロ条項 BSD) ライセンスの下で公開されています。
リンク先情報
- Kilo LISP(源流)
- PC Scheme(関連項目)
- DOS 向けのマイクロコンピュータ用 LISP インタープリタ比較