3

Picolispは初めてです。

私はこれを試し、セグメンテーション違反を取得しました:

: ('(1 2) 6)
Segmentation fault

しかし、私が試してみると:

: ('(a b c) 6)
-> NIL

理由はほぼ理解できますが、PicoLispがエラーではなくセグメンテーションフォールトで応答したのは驚きでした。これは、Picolispが数値が関数であるかどうかをチェックしないが、それが記号である場合はチェックすることを意味しますか?

4

1 に答える 1

3

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
   ?
于 2009-11-11T07:02:44.190 に答える