私はExercise 22.3.3 from HtDPを試していますが、クリックされたボタンのラベルを取得する方法はわかりません。私は文字列が必要だと示唆しているようですが、私はクラスのインスタンスを取得しているこのメッセージdraw-message: expected <string> as second argument, given: (instantiate (class ...) ...)
を取得します。コールバックの答えは?もしそうなら、どのように私はそれを構造化解除するのですか?Racket/PLT-Schemeでボタンのラベルを取り出す方法は?
これは私がこれまで持っているものです。
(define pad1
'((1 2 3)
(4 5 6)
(7 8 9)
(\# 0 *)))
(define pad2
'((1 2 3 +)
(4 5 6 -)
(7 8 9 *)
(0 = \. /)))
(define (title t)
(make-message t))
(define display
(make-message ""))
(define (pad->gui p)
(cond
[(empty? p) empty]
[else (cons (button-maker (first p))
(pad->gui (rest p)))]))
;; make buttons out of a list
(define (button-maker a-list)
(cond
[(empty? a-list) empty]
[(number? (first a-list))(cons (make-button (number->string (first a-list)) call-back)
(button-maker (rest a-list)))]
[(symbol? (first a-list))(cons (make-button (symbol->string (first a-list)) call-back)
(button-maker (rest a-list)))]))
(define (call-back b)
(draw-message display ...))
(create-window
(append (list (list (title "Virtual Phone")))
(list (list display))
(pad->gui pad1)))
私が正しく物事を理解していれば、それが押されたときに、各ボタンがcall-back
を呼び出します。これは、テキストを更新するdisplay
を呼び出す必要があります。しかし、私は発信者のラベルを取得する方法を理解していません。例えばボタン「9」を押すと、call-back
が呼び出されます。しかし、私はどのように値 "9"を取得するのですか?これは私が確信していることです。
マティアス、私はあなたが本の著者の一人であると思っています。ご回答いただきありがとうございました。また、Racket/Schemeを学ぶための優れたリソースもあります。私は上記の私の質問を修正しました、それを見てくださいすることができれば、私が間違って行って参照してください。ところで、セクション24までは 'lambda 'は導入されていないので、言語が「Advanced」以上に設定されていなければ修正された例1は機能しません。 – Greenhorn
私は[マクロを使ったグレートアプリケーションとプログラムの収集](http://stackoverflow.com/q/4548768/298282)も面白いかもしれないと思います。 –
ヒント:4つのスペースでインデントされたテキストはコードとしてレンダリングされます。 – erjiang