2012-03-24 46 views
1

在通過SICP與Steel Bank Common Lisp一起工作的過程中,我獲得了合理的成功,但是我已經遇到了「圖片語言」示例的障礙。以下似乎沒有寫入PPM文件,而我寫的其他旋轉和翻轉操作。我懷疑LAMBDA在標籤內部調用時不會返回一個函數?在LABELS中定義的Lambda不會創建函數嗎?不執行?

我已經M-x check-parens,沒有什麼是孤兒或看似不符合那裏。

(defun below (painter1 painter2) 
    "Divides frame along 2nd axis and invokes a painter on each region" 
    (let ((split-point (make-vect 0.0 0.5))) 
    (labels ((paint-up (fr) 
       (transform-painter painter2 
            (make-vect 0.0 0.0) 
            (make-vect 1.0 0.0) 
            split-point)) 
      (paint-down (fr) 
       (transform-painter painter1 
            split-point 
            (make-vect 1.0 0.5) 
            (make-vect 0.0 1.0)))) 
     #'(lambda (frame) 
      (paint-up frame) 
      (paint-down frame))))) 

(defun krest-below() 
    "Tests BELOW on the KREST-SEGMENTS" 
    (init-buffer 400 400) 
    (funcall (below (segments->painter krest-segments) 
        (segments->painter krest-segments)) 
      (make-frame (cons 0 0) 
         (cons 399 0) 
         (cons 0 399))) 
    (rgb-buffer->ppm "krest-below.ppm" *buffer*)) 
+0

功能測試和工作:INIT-BUFFER,變換畫家,MAKE-VECT,MAKE-FRAME,SEGMENTS->畫家,RGB-BUFFER-> PPM – SquareCrow 2012-03-24 16:03:01

+1

你得到任何錯誤消息?你爲什麼不在你的'paint-'函數中使用'fr'? – Svante 2012-03-24 17:09:48

+0

沒有錯誤。我沒有使用FR,因爲TRANSFORM-PAINTER返回一個將它作爲參數的函數。 – SquareCrow 2012-03-24 17:20:44

回答

1

從斯萬的提示我找到了答案是,我需要確保該功能通過變換PAINTER返回實際上稱爲與FUNCALL並通過FR當標籤PAINT-UP和油漆-DOWN是調用。下面的函數修正如下:

(defun below (painter1 painter2) 
    "Divides frame along 2nd axis and invokes a painter on each region" 
    (let ((split-point (make-vect 0.0 0.5))) 
    (labels ((paint-up (fr) 
     (funcall (transform-painter painter2 
         (make-vect 0.0 0.0) 
         (make-vect 1.0 0.0) 
         split-point) fr)) 
     (paint-down (fr) 
     (funcall (transform-painter painter1 
         split-point 
         (make-vect 1.0 0.5) 
         (make-vect 0.0 1.0)) fr))) 
    #'(lambda (frame) 
    (paint-up frame) 
    (paint-down frame)))))