2011-01-06 72 views
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」?這是我不確定的。

回答

3

正確。繪圖消息函數消耗一個'窗口'和一個'字符串',它在同一部分的圖62中有記錄。您似乎將它應用於「按鈕對象」。參見例子2相同的部分,它看起來是這樣的:

(define a-text-field 
    (make-text "Enter Text:")) 

(define a-message 
    (make-message "`Hello World' is a silly program.")) 

(define (echo-message e) 
    (draw-message a-message (text-contents a-text-field))) 

(define w (create-window 
      (list (list a-text-field a-message) 
       (list (make-button "Copy Now" echo-message))))) 

見回聲訊息話題如何變化顯示當您單擊「複製」鍵。

提示:由於每個按鈕有一個回調,因此您確切知道從哪個按鈕回調中將哪個字符串發送到顯示屏。

更正:本書中的示例1已損壞。使用

(define u 
    (create-window (list (list (make-button "Close" (lambda (x) (hide-window u))))))) 

改爲。

+0

馬蒂亞斯,我看你是本書的作者之一;感謝您抽出時間做出迴應,同時也感謝您爲學習球拍/計劃提供了極好的資源。我已經修改了上面的問題,請看看它,如果可以的話,看看我哪裏出了問題。順便說一下,'lambda'直到第24節才被引入,因此除非語言已被設置爲高級或更高版本,否則更正的示例1將不起作用。 – Greenhorn 2011-01-06 15:55:06