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の操作方法についても説明されています。
全文翻訳
Schemy LISP en DOS
About
SLED (Schemy Lisp en DOS) は、Schemeに(大部分)触発された機能を持つ、純粋な記号処理 LISP (LISt Processor) です。元々は素晴らしいKilo LISPから派生しましたが、マクロなどの一部の機能は削除され、他の機能が追加されています。SLEDはUr-Lispに分類でき、FreeDOS、DR DOS、またはMS-DOSのような DOS (Disk Operating System) 上、あるいはDOSBox、DOSBox-X、またはDOSBox-StagingのようなDOSエミュレータ上で実行できます。提供されるシンボル、特殊形式、組み込み関数、標準ライブラリの概要については、インデックスを参照してください。SLEDを入手するには:
全体として、SLEDはDOSのためのLISPです。
Language
リストは、最も一般的な意味でのコンピュータ言語です。プログラミング言語、データ形式、またはシリアライゼーションになり得ます。したがって、リストはデータとコードの基本的な表現です。Lispでは、リストは括弧 (、) で囲まれ、リストの要素はスペースで区切られます。
(begin lisp)
リストがコードを表す場合、その最初の要素はポーランド記法や、一般的に動詞-主語-目的語言語のように、アクション(関数)を示します。LISPはそのようなコンピュータ言語です。通常、Scheme LISPは関数型プログラミング言語に分類されます。
Data
2つの基本的なデータ型があります:ペアとアトム(非ペア)です。アトムには3つのバリアントがあります:シンボル、クロージャ(関数)、およびいくつかの特殊シンボルです。
Symbols
シンボルは一意の名前であり、以下の40文字のうち1文字から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 0 1 2 3 4 5 6 7 8 9 _ - ? .
ただし、エスケープされていない . は先頭文字にできません。
さらに、エスケープ文字 \ (バックスラッシュ) を前に付けることで、ほとんどのASCII文字をシンボルの一部にできますが、エスケープできない (、)、'、$ は例外です。ただし、シンボルには表示可能なASCII文字を使用することが推奨されます。
This\ is\ a\ sym\!
さらに、大文字は受け入れられますが、文字がエスケープされていない限り小文字に変換されます。
Special Symbols
SLEDによって管理されるいくつかの事前定義された特殊シンボルがあります。例えば nil は「空リスト」を意味します。詳細はインデックスを参照してください。
Quote
クォートは「評価しない」という意味で、quote 特殊形式によって宣言されます:
(quote sym)
便宜上、' の短縮構文を使用できます:
'sym
基本的にクォーティングは、コードではなくデータとして何かを宣言します。
Empty List
nil 特殊シンボルには複数の意味があります:空リストを表すため、'() と等価です。また、「偽」と評価される唯一の値でもあります。
Pairs
ペアはヘッドとテールで構成され、それぞれがアトムまたは別のペアのいずれかを含みます。ペアは . (ドット) を使用してデータとして作成できます:
'(a . x)
または cons 組み込み関数の結果として:
(cons 'a 'x)
ペアの要素(ヘッドとテール)は不変です。
Lists
リストは、各テールが別のペアを指し、最後のペアのテールが nil 値(() と等価)であるペアのシーケンスです。以下はリストの例です:
nil
'()
'(a . nil)
'(a . (b . nil))
リストは次のようにデータとしても作成できます:
'(a b)
または(標準ライブラリの)list 関数の結果として:
(list 'a 'b)
Improper List
不完全リストは nil で終端しません。例:
(a . (b . (c . d)))
Association List
連想リストは、各要素がペア(アソシエーション)であるリストです:
((a . x) (b . y) (c . z))
このようなペア要素のヘッド部分はキーと呼ばれ、テールは値と呼ばれます。
S-Expressions
シンボリック式(S-expression)は、次のように定義されるデータ構造です:S-式は、アトムまたは2つのS式のペアのいずれかです。Lisp、Scheme、特にSLEDでは、S式はデータとソースコードの両方に使用されます。
Numbers
SLEDシステムには数値型はありません。しかし、リストを使用して自然数(非負整数)をエミュレートできます:
'() ; ゼロ
'(nil) ; 1
'(nil nil) ; 2
'(nil nil nil) ; 3
これらはタリー数詞であり、基数(数)が大きさを表します。これは単項タリー数に似ています。inc、dec、zero? 関数はカウントタスクに役立ちます。
Code
LISPでは、クォートされていないデータはコードとして評価されます。
Expressions
式は評価できます。例:
- バインディング
- 関数
- 特殊形式
Bindings
バインディングはシンボルをデータペイロードにリンクし、define 特殊形式を介して作成されます:
(define a 'x)
Closures
クロージャは関数と環境のセットであり、lambda 特殊形式の結果です:
(define fun (lambda (arg1 arg2) (print arg1) (print arg2)))
Function Application
クォートされていないリストの最初の要素は関数に評価される式と解釈され、残りの要素はそれらの関数の引数となります:
(fun arg1 arg2)
関数評価は厳格です。つまり、まず引数式が評価され、次に評価された引数を使用して関数適用が行われます。
Arguments
引数は評価され、値のリストとして関数に渡されます。
これは、関数パラメータをさまざまな方法で設定できることを意味します:
(lambda x ...) ; x はリスト
(lambda (x y) ...) ; 要素 x と y を持つデストラクチャ化されたリスト
(lambda (x y . z) ...) ; z はリスト(デフォルトで nil)
オプションの引数は、上記の z のようにリストとして渡すことができます。
Recursion
LISPは反復ではなく再帰に依存します。再帰とは、関数が自身を呼び出すことです。SLEDの2つの機能は、深い再帰でのスタックオーバーフローを回避するのに役立ちます:トランポリン評価器と末尾呼び出し最適化(TCO)です。TCOは lambda、let、begin、if、ifnil、および apply で機能します。さらに、再帰が2番目の引数で実行される場合、TCOは cons で機能します。
Errors
式の評価中のエラーはトップレベルにジャンプし、そこでエラーの発生をテストできます。load 関数内のエラーを除き、エラーは式内でキャッチできません。
Builtin Functions
SLED実行可能ファイルには、システムとの対話やコア機能を提供するための組み込み関数セットがあります。詳細はインデックスを参照してください。
Standard Library
コア関数に加えて、一連の典型的な関数が sled.scm ファイルに標準ライブラリとして実装されています。詳細はインデックスを参照してください。標準ライブラリは、追加のカスタム定義で拡張できます。
Special Forms
特定の形式は関数のように見えますが、そうではありません。これらは特殊形式と呼ばれ、関数の動作に従わず、関数と同じ構文を使用します。たとえば、if は引数を評価する前に形式を解決しません。さらに、特殊形式は最初の位置に表示する必要があり、apply の引数にすることも、エイリアスにすることもできません。詳細はインデックスを参照してください。
Immutability
特殊シンボル、特殊形式、組み込み関数、および標準ライブラリの内容は、SLEDでは不変です。さらに、特殊形式と組み込み関数はシャドウできません。標準ライブラリと隣接するカスタム定義は再定義できません。
System
SLED LISPシステムはDOSアプリケーションです。
File Names
ファイル名はDOS 8.3命名規則(ファイル名に最大8文字、ドット、拡張子に最大3文字)に従う必要があります。このLISPで実行されるスクリプトの推奨ファイル拡張子は、構文的な類似性から .scm です。例えば、標準ライブラリの名前は sled.scm です。ただし、インタープリタはファイル拡張子をチェックしません。
Startup
sled が最初に行うことは、標準ライブラリをロードすることです。これは sled.scm という名前で、SLED.EXE インタープリタ実行可能ファイルと同じディレクトリにある必要があります。標準ライブラリからロードされたすべてのシンボルとその値は不変になります。
Command-Line Arguments
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
ファイルパスは最後の引数である必要があり、追加の引数は無視されます。
File Path
インタープリタでは、パスにバックスラッシュが含まれている場合、パスはシンボルになり、バックスラッシュ \ 単体は許容されるシンボル文字ではないため、エスケープする必要があります。
C:\> sled to\my\code.scm
(load 'to\\my\\code.scm)
ファイルパスも16文字の制限の対象となります。
REPL
sled が起動すると、read-eval-print-loop (REPL) がプロンプトで始まります:
sled>
入力を読み込み、評価し、結果を表示し、再度プロンプトを表示します。
さあ、楽しんでください:
sled> (println 'hello _ 'world)
Extended Characters
落とし穴は、サポートされていない拡張(2バイト)文字です。例として、REPLで矢印キーを使用すると、標準入力エコーに α(アルファ)が表示されます。これらの拡張文字は入力ストリームを汚染し、削除しても入力行でエラーを引き起こす可能性があります。したがって、拡張文字を含む行はエラーを発生させ、その行を破棄します。
Exiting
sled を終了する通常の方法は2つあります。
最初の方法はトップレベルのドル記号 $ で、これはパーサーに終了を指示します:
sled> $
2番目は (exit) 組み込み関数で、評価されると終了します:
(exit)
quit は exit のエイリアスです。
Comments
コメントはパーサーによって無視されます。コメントはセミコロンで導入されます:
;
次の行ブレークまでのすべての文字はパーサーによって無視されます。伝統的に、連続するセミコロンの数は、Markdownの見出しと同様に意味を持ちます:
;;;; main title
;;; section title
;; start of line
; end of line
さらに、ブロックコメントは comment という名前の特殊形式を介して実現されます:
(comment ...)
コメント内の括弧はバランスが取れている必要があります:
(comment ()) ; OK
(comment () ; → error
コメント形式は直接クォートできないことに注意してください:
'(comment test) ; → error
'(a (comment ignored) b) ; (a b)
Breaking
純粋な計算を中断するには CTRL+Break を使用し、入力を中断するには CTRL+C が利用可能です。
Help
REPLでは、? シンボルを使用して特殊形式、組み込み関数、および標準ライブラリシンボルのリストを表示できます。
Limits
リアルモードのDOSプログラムとして、SLEDには複数の制約があります:
- ヒープは12288ノード
- シンボルテーブルは4096文字
標準ライブラリは約5%のノードと文字を消費します。
Index
Special Symbols Special Forms Builtin Functions
apply | atom? | cons |
defined? | empty? | env |
eof? | equiv? | error |
exit | gc | head |
load | newline | print |
proc? | read | restart |
scm | symbol? | tail |
Standard Aliases Standard Library
and? | append | assert |
compose | dec | equal? |
error? | get | id |
inc | list | list? |
map | member | or? |
pair? | printid | println |
put | revpend | shorter? |
$ {exit}
この特殊シンボルはREPLを終了します。これは (exit) の短縮形ではなく、パーサーによって解決されます。ロードされたファイルでは、それ以降のすべてを無視して、そのファイルのロードを終了します。
? {help}
この特殊シンボルは、特殊形式、組み込み関数、および標準ライブラリの概要を表示します。REPLからのみ機能し、評価に先行します。
' {quote}
この特殊シンボルは quote 特殊形式のエイリアスです。
_ {space}
この標準エイリアスはスペース文字 ' のためのものです。
and? <arg1> <arg2>
この標準ライブラリの二項述語は、両方の引数が nil でない場合に true を返します。複合条件を単純化するために使用します。
(and? nil nil) ; → nil
(and? nil true) ; → nil
(and? true nil) ; → nil
(and? true true) ; → true
注: Schemeとは異なり、これは順次評価される可変引数の特殊形式ではなく、両方の引数を評価する二項関数です。
ans
この特殊シンボルは、値を生み出した最後のトップレベルフォームの結果を含みます。エラーの場合、ans は err に設定され、error? でテストできます。
ans
append <lst1> <lst2>
この標準ライブラリの二項関数は、最初の引数リストの末尾に2番目の引数リストを連結したリストを返します。
(append nil (list 'a)) ; → (a)
(append (list 'a) nil) ; → (a)
(append (list 'a) (list 'b)) ; → (a b)
(append '(a b) '(c d)) ; → (a b c d)
(append '(a) 'b) ; → (a . b)
apply <fun> <lst>
この組み込み二項関数は、最初の引数関数を2番目の引数リストを引数として評価します。
(apply list '(a b c)) ; → (a b c)
assert <arg> <sym>
この標準ライブラリの二項手続きは、最初の引数が nil と評価された場合に2番目の引数を表示してエラーを引き起こし、それ以外の場合は最初の引数を返します。
(assert nil 'list\ empty)
atom? <arg>
この組み込み単項述語は、引数がアトムである場合に true を返します。
(atom? nil) ; → true
(atom? true) ; → true
(atom? '(a)) ; → nil
begin <body1> ... <bodyN>
この特殊形式は、引数を順次評価し、最後の引数の戻り値を返します。
(begin (print 'a) (print 'b) 'c) ; → c
(begin) ; → nil
br
この標準エイリアスは newline のためのものです。
この特殊形式は評価されません。ブロックコメントとして使用します。他の特殊形式とは異なり、これは評価前にパーサーによってデコードされます。
(comment this :-D is ignored)
注:
comment内の括弧はバランスが取れている必要があります。
compose <arg> <fun1> ... <funN>
この標準ライブラリの可変長関数は、単項関数をパイプライン処理します。2番目の引数が最初の引数に適用され、3番目の引数が前の戻り値に適用され、以下同様に続きます。最後の引数の戻り値が結果として返されます。
(compose nil inc inc) ; → (nil nil)
cons <arg1> <arg2>
この組み込み二項関数は、最初の引数をヘッド、2番目の引数をテールとするペアを返します。
(cons 'a 'b) ; → (a . b)
dec <arg>
この標準ライブラリの単項関数は、リストが空でない場合にリストのテールを返します。タリー数をデクリメントするために使用します。
(dec '(nil . nil)) ; → nil
define <sym> <arg>
この特殊形式は、2番目の引数を最初の引数シンボルに新しいバインディングを作成し、2番目の引数を返します。特殊シンボル、特殊形式、組み込み関数、または標準ライブラリシンボルを除き、バインディングは再定義できます。
(define hello 'world) ; → world
注:
defineは、letまたはlambda内で使用される場合でも、常にグローバルバインディングに影響します。
defined? <sym>
この組み込み単項述語は、引数シンボルがグローバルスコープで既に定義されている場合に true を返します。
(defined? 'defined?) ; → true
(defined? 'undefined) ; → nil
empty? <arg>
この組み込み単項述語は、引数が空リストである場合に true を返します。
(empty? nil) ; → true
env
この組み込みソングは、現在のユーザー定義シンボルを表示します。
(env) ; → nil
eof? <arg>
この組み込み単項述語は、引数がファイルの終わり(EOF)または送信終了(EOT)マーカーに評価される場合に true を返します。
(ifnil (eof? (read)) 'none)
equal? <arg1> <arg2>
この標準ライブラリの二項述語は、引数が再帰的に等しい場合に true を返します。ペアとリストの比較に使用しますが、equal? はアトムの場合は equiv? にフォールバックします。
(equal? '(nil nil) (list nil nil)) ; → true
(equal? nil nil) ; → true
equiv? <arg1> <arg2>
この組み込み二項述語は、引数が浅く等しい場合に true を返します。アトムの比較に使用します。
(equiv? nil nil) ; → true
err
この特殊シンボルはエラー状態を示します。
(head nil) ; → ? type
(equiv? err ans) ; → true
error <sym> [<arg>]
この組み込み手続きはエラーを発生させ、現在のフォームの評価を中断させます。さらに、最初の引数シンボル(エラーメッセージ)とオプションの2番目の引数式(エラー理由)が表示されます。
(error 'bad\ error (list 'not 'right))
error?
この標準ライブラリのソング述語は、前の評価がエラーになった場合に true を返します。
(head nil) ; → ? type
(error?) ; → true
exit
この組み込みソングはインタープリタまたはREPLを終了します。
(exit) ; back to DOS
gc [<arg>]
この組み込み手続きはガベージコレクションをトリガーします。引数が nil でない場合、ノード使用量が表示されます。
(gc) ; → nil
(gc nil) ; → nil
(gc true) ; → nil
get <sym> <lst>
この標準ライブラリの二項関数は、2番目の引数連想リスト内で最初の引数シンボルが見つかった場合に、そのシンボルにペア化された値を返します。見つからない場合は nil を返します。
(get 'a '((a . x) (b . y))) ; → x
(get 'z '((a . x) (b . y))) ; → nil
注: キーの比較には
equiv?を使用します。
head <arg>
この組み込み単項関数は、コンスセルまたはリストのヘッド部分を返します。
(head (cons 'a 'b)) ; → a
注: この関数は、古典的なLISPやSchemeの
carに相当します。
id <arg>
この標準ライブラリの単項関数は、引数を返します。恒等関数として使用します。
(id 'x) ; → x
if <arg1> <arg2> [<arg3>]
この特殊形式は、最初の引数を評価します。nil と評価されない場合は、2番目の引数が評価されて返されます。それ以外の場合は、3番目の引数が評価されて返されます。3番目の引数がない場合は nil が返されます。
(if 'ok 'con 'alt) ; → con
(if nil 'con 'alt) ; → alt
(if 'ok 'con) ; → con
(if nil 'con) ; → nil
ifnil <arg1> <arg2>
この特殊形式は、最初の引数を評価し、それが nil でない場合はその結果を返します。それ以外の場合は、2番目の引数を評価して返します。
(ifnil 'ok 'alt) ; → ok
(ifnil nil 'alt) ; → alt
inc <arg>
この標準ライブラリの単項関数は、リストの先頭に nil を追加します。タリー数をインクリメントするために使用します。
(inc nil) ; → (nil)
(inc '(nil)) ; → (nil nil)
lambda (<arg1> ... <argN>) <body1> ... <bodyN>
この特殊形式は、デストラクチャ化されたリストとしての引数と、順次評価される本体を持つ関数を作成します。本体の最後の式が戻り値となります。
(lambda (x y) (print x) y) ; → x を表示して y を返す関数
let (<arg1> <arg2>) <body1> ... <bodyN>
この特殊形式は、ローカルバインディングを持つスコープを作成し、その本体を順次評価します。
(let (x 'y) x) ; → y
注: Schemeとは異なり、この特殊形式は単一のローカルバインディングのみを許可します。複数のバインディングは
letをネストすることで実現できます。
list <arg1> ... <argN>
この標準ライブラリの可変長関数は、引数のリストを構築します。
(list) ; → nil
(list 'a) ; → (a)
(list 'a 'b) ; → (a b)
list? <arg>
この標準ライブラリの単項述語は、引数が適切なリストである場合に true を返します。
(list? nil) ; → true
(list? true) ; → nil
(list? '(x y)) ; → true
load <sym> [<arg>]
この組み込み関数は、引数シンボル(パス)で指定されたファイルのコンテンツを評価し、最後の回答を返します。2番目の引数が nil でない場合、ロード中のエラーは無視されます。
(load 'myscript.scm)
(load 'myscript.scm true)
注: ロードは最大2回までネストできます。
map <fun> <lst>
この標準ライブラリの二項関数は、最初の引数単項関数を2番目の引数リストの各要素に適用し、戻り値のリストを返します。
(map inc '(nil (nil))) ; → ((nil) (nil nil))
member <arg> <lst>
この標準ライブラリの二項関数は、2番目の引数リストからヘッドが最初の引数であるペアを返します。それ以外の場合は nil を返します。
(member 'b '(a b c)) ; → (b c)
(member 'd '(a b c)) ; → nil
注: リスト要素の比較には
equiv?を使用します。
newline
この組み込みソングは改行を出力します。出力フォーマットに使用します。
(newline) ; → nil
nil
この特殊シンボルは空リストを表します。また、「偽」と評価される唯一の値でもあります。等価に、nil のために '() を使用できます。
nil ; → nil
'() ; → nil
nil? <arg>
これは empty? の標準エイリアスです。nil のテストに使用します。
(nil? nil) ; → true
(nil? '()) ; → true
(nil? _) ; → nil
(nil? (list)) ; → true
not <arg>
これは empty? の標準エイリアスです。述語の結果を反転するために使用します。
(not nil) ; → true
(not true) ; → nil
or? <arg1> <arg2>
この標準ライブラリの二項述語は、いずれかの引数が nil でない場合に true を返します。複合条件を単純化するために使用します。
(or? nil nil) ; → nil
(or? nil true) ; → true
(or? true nil) ; → true
(or? true true) ; → true
注: Schemeとは異なり、これは順次評価される可変引数の特殊形式ではなく、両方の引数を評価する二項関数です。
pair? <arg>
この標準ライブラリの単項述語は、引数がアトムでない場合に true を返します。
(pair? 'a) ; → nil
(pair? '(a b)) ; → true
(pair? nil) ; → nil
print <arg1> ... <argN>
この組み込み可変長手続きは、引数を標準出力に出力します。
(print 'hi) ; → nil
(print 'hello _ 'world) ; → nil
(print '(a b)) ; → nil
printid <arg1> [<arg2>]
この標準ライブラリ関数は、最初の引数を表示し、その後に改行を付けて返します。指定された場合、2番目の引数が最初に表示され、その後に : が続きます。
(printid '42 'answer) ; → 42
println <arg1> ... <argN>
この標準ライブラリの可変長手続きは、引数を標準出力に出力し、改行を追加します。
(println 'hi) ; → nil
(println 'hello _ 'world) ; → nil
(println '(a b)) ; → nil
proc? <arg>
この組み込み単項述語は、引数がクロージャまたは組み込み関数である場合に true を返します。特殊形式の場合、この述語は nil を返します。
(proc? map) ; → true
(proc? proc?) ; → true
(proc? nil) ; → nil
(proc? if) ; → nil
put <sym> <arg> <lst>
この標準ライブラリ関数は、3番目の引数連想リストのコピーを返しますが、最初のマッチするペアのテールを最初の引数シンボルをヘッドとして設定するか、最初の引数シンボルをヘッドとし2番目の引数をテールとするペアを追加します。3番目の引数に最初の引数シンボルをヘッドとするペアがリストされていない場合です。
(put 'hello 'world nil) ; → ((hello . world))
(put 'one 'uno '((one . a))) ; → ((one . uno))
(put 'two 'b '((one . a))) ; → ((one . a) (two . b))
(put 'two 'z '((one . a) (two . b))) ; → ((one . a) (two . z))
quit
この標準エイリアスは exit のためのものです。
quote <arg>
この特殊形式は、引数を評価せずに返します。
(quote a) ; → a
'a ; → a
read
この組み込みソングは、キーボードから1つのシンボル入力を読み込み、空白またはリターンキー/エンターキーで区切られたものを返し、それを返します。
(read)
注:
readは'をプロンプトとして表示し、キーボードから1つのシンボルを読み込みます(標準入力ではありません)。エラーではなく、空または無効な入力で再プロンプトを表示し、Ctrl+Z(EOF) でEOTを返します。
restart [<sym>]
この組み込み関数は、インタープリタをリセットして再起動し、オプションで引数シンボルで指定されたファイルをロードします。すべての定義は失われます!
(restart 'next.scm)
revpend <lst1> [<lst2>]
この標準ライブラリの二項関数は、最初の引数リストを反転し、2番目の引数リストを連結します。リストを反転するためにも使用します。
(revpend (list 'a 'b 'c) '(d e)) ; → (c b a d e)
(revpend (list 'a 'b 'c)) ; → (c b a)
scm <arg1> ... <argN>
この組み込み関数は、低解像度グラフィックスプログラミングのための「スーパーキャラクターモード」を提供します。詳細はscm ドキュメントを参照してください。
self <arg1> ... <argN>
この特殊シンボルは、匿名再帰を有効にします。任意のクロージャ内で、それは囲んでいる lambda に解決されます。lambda の外では、self は未定義です。
((lambda (x)
(if (empty? x) nil
(self (tail x)))) (list nil nil)) ; → nil
注:
selfは常に最も内側のlambdaを参照します。
shorter? <lst1> <lst2>
この標準ライブラリの二項述語は、最初の引数リストの要素数が2番目の引数リストの要素数より少ない場合に true を返します。
(shorter? nil (list nil)) ; → true
(shorter? (list nil) nil) ; → nil
symbol? <arg>
この組み込み単項述語は、引数がシンボルである場合に true を返します。
(symbol? 'a) ; → true
tail <arg>
この組み込み単項関数は、コンスセルのテール部分を返します。
(tail (cons 'a 'b)) ; → b
注: この関数は、古典的なLISPやSchemeの
cdrに相当します。
true
この特殊シンボルは true に評価されます。汎用的な「真」の値として使用します。
true ; → true
value <sym>
この特殊形式は、シンボルを生成する必要がある引数を評価し、そのシンボルの値を返します。レキシカルスコープを尊重します。
(value 'ver) ; → sled-0.6
ver
この特殊シンボルは、SLEDのバージョンを識別するシンボルに評価されます。
ver ; → sled-0.6
Usage
- SLEDは、FreeDOSやMS-DOS (>=3) のようなディスクオペレーティングシステムのために作られています。
- DOS以外では、DOSBox、DOSBox-X、DOSBox-Staging のようなDOSエミュレータが必要です。
- libcは使用せず、すべてのI/Oは直接
int 21hを介して行われます。 - リアルモードの「スモールメモリモデル」(64Kデータセグメントと64Kコードセグメント)を使用します。
- 最低でも、286 CPUと256K RAMがあれば十分です。
- Linux、BSD、macOS、またはUnixでは、シェルスクリプト
./sled.sh(インストールされているDOSBoxを自動選択)を実行します。 - いくつかのサンプルコードが
demoフォルダにあります。例えば、(load 'demo\fractal.scm)を実行します。 - SLEDのビルドには、Microsoft C Compiler または Open Watcom および
makeが必要です。 - MS C 6.0A でビルドするには:
make build_msc(コンパイラ場所はMSCで指定)。 - Open Watcom v2 でビルドするには:
make build_owc(コンパイラ場所はOWCで指定)。 - ビルドを実行するには:
make run - テストを実行するには:
make tests - ベンチマークを実行するには:
make bench(テイクオフ関数、こちらとあちらを参照)。
Links
- DOS
- Kilo LISP
- PC Scheme
- The implementation of PC Scheme
- A Comparison of Three LISP Interpreters for MS-DOS-Based Microcomputers
- Free Lisp development environments for DOS
- S-expressions
This project by gramian is licensed under the 0BSD (Zero-Clause BSD) license.