-1

スキームで複数の定義を1つの名前にバインドできることをどこかで読んだと思います。用語を間違って使用している可能性があることはわかっています。これは、次のことを実行できることを意味します(これは、演算子を定義するのに非常に便利です)。

私はこのようなものを読んだと思います(これは実際の構文ではないことを知っています)

(let ()
define operator "+"
define operator "-"
define operator "*"
define operator "/"))

すべての演算子に対して別の変数をテストしたいと思います。

4

2 に答える 2

1

あなたが何を求めているのかよくわかりません。さまざまなタイプの引数を処理できる単一のプロシージャが必要ですか?

(define (super-add arg1 arg2)
  (cond ((and (string? arg1) (string? arg2))
         (string-append arg1 arg2))
        ((and (number? arg1) (number? arg2))
         (+ arg1 arg2))
        (else
          (error "UNKNOWN TYPE -- SUPER-ADD"))))

(super-add "a" "b") => "ab"
(super-add 2 2) => 4

メッセージパッシングに興味がありますか?

(define (math-ops msg)  ;<---- returns a procedure depending on the msg
  (cond ((eq? msg 'add) +)
        ((eq? msg 'sub) -)
        ((eq? msg 'div) /)
        ((eq? msg 'multi) *)
        (else
          (error "UNKNOWN MSG -- math-ops"))))

((math-ops 'add) 2 2) => 4
((math-ops 'sub) 2 2) => 0

letまた、バインディングの適切な構文:

(let (([symbol] [value])
      ([symbol] [value]))
   ([body]))

(let ((a 2)
      (b (* 3 3)))
   (+ a b))

 => 11

何をしようとしているのかを明確にしないと、これ以上のことを助けるのは非常に難しいでしょう。

編集:あなたのコメントの後、私はあなたが探しているものについて少し良いアイデアを持っています。あなたが意味する方法で同じ名前に複数の値をバインドする方法はありません。あなたは、あなたが見ているものがあなたの演算子の1つであるかどうかを教えてくれる述語を探しています。あなたのコメントから、あなたは文字列を取り入れているように見えたので、これはこれに基づいています:

(define (operator? x)
    (or (string=? "+" x) (string=? "-" x) (string=? "*" x) (string=? "/" x)))

単一の文字列を取り込む場合は、それを小さな部分に分割する必要があります。ラケットには、これを行うための手順regexp-splitが組み込まれています。

(define str-lst (regexp-split #rx" +" [input str]))
于 2012-05-06T01:32:47.223 に答える
0

あなたはvalues「継続への議論を提供する」構成を参照しているかもしれません。関数から複数の値を返すために使用できます。例えば、

(define (addsub x y)
  (values (+ x y) (- x y)))

(call-with-values
  (lambda () (addsub 33 12))
  (lambda (sum difference)
    (display "33 + 12 = ") (display sum) (newline)
    (display "33 - 12 = ") (display difference) (newline)))
于 2012-05-06T07:26:17.337 に答える