HtDP から演習 22.3.3 を試みていますが、クリックされたボタンのラベルを取得する方法がわかりません。draw-message: expected <string> as second argument, given: (instantiate (class ...) ...)
文字列が必要であることを示唆しているように見えるこのメッセージが表示されますが、クラスのインスタンスを取得しています。答えはコールバックにありますか? もしそうなら、どうすればそれを分解できますか?
これは私がこれまでに持っているものです:
(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」を取得するにはどうすればよいですか? これは私が確信していないことです。