(car '(+ 1 2)) => '+ not +
+手順ですが、「+は単なる記号であります!
あなたは引用符で囲まれていない変数をチェックする必要があります:
(procedure? (car (list + 1 2))); => #t
;or
(procedure? (car `(,+ 1 2))); =>#t
リストは、フォーム「(ABCD)であるならば、あなたはこのような方法で確認することができます:
(procedure? (eval (car '(+ 1 2)) (interaction-environment)));=>#t
理由:
(eval (car '(+ 1 2)) (interaction-environment))
;=>(eval '+ (interaction-environment))
;=>+
マクロが必要ないとは思いますが、機能は十分です。機能 抽象:リストのcar
が結合していないシンボルが許可される場合
(define (application-form? lst)
(procedure? (eval (car lst) (interaction-environment))))
これは、リストの 'car'がアンバウンドシンボルである場合にエラーを発生させます。 (実際に移植可能な問題ではないのではないかと恐れています...) –
私は見ていますが、ケースを考えてみましょう。(アプリケーション形式? '((λ(x)x)1))、確かに車の部分(lambda(x)x)は手続きですが、#f – FooBee
と "procedure?"を含むすべての型述語を返します。 "ペア?" "リスト?"引数がunboundである場合にエラーを発生させます。私は、私たちのプロシージャは同じ振る舞いを持つべきだと私は考えます。 – FooBee