0
我在嘗試Exercise 22.3.3 from HtDP,但不知道如何檢索被點擊的按鈕的標籤。我得到這個消息draw-message: expected <string> as second argument, given: (instantiate (class ...) ...)
似乎表明我需要一個字符串,但我得到一個類的實例。回調中的答案是?如果是這樣,我該如何解構它?如何檢索球拍/ PLT方案中的按鈕標籤?
這是我到目前爲止有:
(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」?這是我不確定的。
馬蒂亞斯,我看你是本書的作者之一;感謝您抽出時間做出迴應,同時也感謝您爲學習球拍/計劃提供了極好的資源。我已經修改了上面的問題,請看看它,如果可以的話,看看我哪裏出了問題。順便說一下,'lambda'直到第24節才被引入,因此除非語言已被設置爲高級或更高版本,否則更正的示例1將不起作用。 – Greenhorn 2011-01-06 15:55:06