Picolispは初めてです。
私はこれを試し、セグメンテーション違反を取得しました:
: ('(1 2) 6)
Segmentation fault
しかし、私が試してみると:
: ('(a b c) 6)
-> NIL
理由はほぼ理解できますが、PicoLispがエラーではなくセグメンテーションフォールトで応答したのは驚きでした。これは、Picolispが数値が関数であるかどうかをチェックしないが、それが記号である場合はチェックすることを意味しますか?
(picolispメーリングリストから取得。)
はい、これは予想される動作です。
PicoLispは、関数にヒットするまで、リストのCARをおそらく繰り返し評価します。関数は、リスト(Lispレベルの関数)または短い数値(asmまたはCで記述された組み込み関数)のいずれかです。その番号が実行可能コード(実行時にチェックするのが難しい)を指していない場合、クラッシュが発生します。
このようなクラッシュは「拡張エラーメッセージ」と見なします。ハードウェア(MMU)にランタイムチェックを行わせないのはなぜですか?
一般に、インタープリターに起こりうるエラー(たとえば、無限ループを考えてください)をキャッチさせることはできないため、PicoLispはプログラマーに何らかの責任を与える立場にあります。
実際には、上記のようなエラーは、プログラムの最初のテスト実行時に検出されます。
ところで、上記のルールの例外は、CARに直接番号が含まれているリストのみです。このようなリストは自動評価します。
: (1 2 3)
-> (1 2 3)
このような定数リストを引用する必要がない、単なる便利な機能です。
: ('(a b c) 6)
-> NIL
理由はほぼ理解できますが、Picolispがエラーではなくセグメンテーションフォールトで応答したのは驚きでした。これは、Picolispが数値が関数であるかどうかをチェックしないが、それが記号である場合はチェックすることを意味しますか?
その場合、(abc)は実際には正当な関数定義です。これは、単一のシンボリックパラメーター'a'(関数が引数を評価しないようにするため)と2つのシンボルの本体を持つ関数です。これは同等です
: (de foo a
b
c )
-> foo
この関数を実行すると、引数リスト(3)がそのシンボル「a」にバインドされ、「b」と「c」が実行されます。この関数は、「c」の値を返します。これは、例ではNILでした。
あなたがするとき:
: (de foo H H) : (foo 1 2 3) -> (1 2 3) : foo -> (H H)
したがって、次のこともできます。
: ('(H H) 1 2 3) -> (1 2 3)
正しい。
ここで何が起こるか知っているに違いない。数値を変数として使用しようとしていますが、これは違法です->クラッシュ(とにかく意味がないことを除いて)
あなたの言ったことは正しいです。インタプリタは、期待される関数パラメータの代わりに「1」をヒットします。
: (setq 7 5)
!? (setq 7 5)
7 -- Variable expected
?