次の s 式を考えてみましょう。
((lambda (car) (car (quote (a b c)))) cdr)
私が試したほとんどのスキームの実装では、 this は と評価されます。これ(b c)
はcdr
、 という名前のラムダに渡され、car
のプリミティブな実装よりも優先されcar
ます。
The Little Schemer は、第 10 章の scheme で記述された scheme の実装を提供します。その実装はa
上記の式を返しますが、これは私には正しくないようです。
その実装がそのように振る舞う理由は明らかです: プリミティブ関数の名前はhere*const
ではなくとして扱われます。数値でもブール値でもない はプリミティブとしてレンダリングされ、これは最終的に実際のプリミティブに組み込まれます。*identifier
*const
正しい実装は、プリミティブ名を特別に検出するのではなく、プリミティブ名を実際のプリミティブ実装にマッピングするエントリを含む値関数に初期テーブルを作成することだと思います。
私の質問は次のとおりです。これは The Little Schemer のスキームの実装のバグですか? この行動はスキームで明確に規定されているのでしょうか、それとも本書が書かれた 1974 年には明確に規定されていなかったのでしょうか?