4

デジタル エレクトロニクス コース用の真理値表ジェネレーターを作ろうとしています。

とにかく、演算子に相当する文字列をキーとして持つハッシュと、それらの演算子に対応するSchemeプロシージャを値として持つと思いました。

例えば

(定義演算子テーブル #hash(("+" . or)
                              ("*" 。 と)))

だから私は次のようなことができます

(lambda (a b) ((hash-ref operator-table (string-ref input-str i)) a b))

and今、私は上記がおそらく正しく動作しないことに気付きましたが、どうやらとorはSchemeで特別であるため、正しく動作するまでそれをいじることさえできません。REPL で入力するnotと、返信が返ってきます#<procedure:not>。しかし、andまたはを指定orすると、 と表示されますand: bad syntax in: and。使用できるプロシージャ バージョンはありandますか? または、で作成する必要がありlambdaますか?それとも、何かが完全に欠けていますか?

最初からラムダを使用しなかった唯一の理由は、ビルトインの可変アリティ機能を失いたくないということですand[私は(and #t #f)同様に実行できます(and #t #f #f #t #f #t)]。

4

2 に答える 2

6

andの関数形式を (短絡しないという制限付きで) 使用しandor可変アリティ プロパティを失わない場合は、次のように簡単に実行できます。

(define (and* . xs) (andmap values xs))
(define (or*  . xs) (ormap values xs))

(valuesは (PLT) スキームの慣用的な恒等関数です。)

于 2009-11-02T03:59:23.817 に答える
3

そうです、Scheme (ほとんどの言語と同様) は "熱心な" 言語であるため、プロシージャにすることはできません。プロシージャへのすべての引数は、プロシージャが制御を取得する (引数の値を受け取る) 前に評価されます。 andまたor、「短絡」する必要があります -- 最終結果が判明したらすぐに引数の評価を停止します -- そのため、熱心な言語 (Haskell などの「怠惰な」言語 -- それぞれが引数は、必要なときに必要に応じて評価されます -- は非常に異なる品種であり、この「通常の関数」と「特別な形式」の区別は必要ありません...しかし、残念ながら、Scheme はそれらの 1 つではありません! )。

于 2009-11-02T03:19:15.117 に答える