Лямбда, определенная в LABELS, не создает функцию? Не выполняет? - PullRequest
1 голос
/ 24 марта 2012

Работая через SICP со Steel Bank Common Lisp, я добился разумного успеха, однако наткнулся на загадку на примере «Picture Language».Кажется, что следующее не пишет в файл PPM, в то время как другие повороты и перевороты, которые я написал, делают.Я подозреваю, что LAMBDA почему-то не возвращает функцию, когда она вызывается внутри LABELS?

У меня уже есть Mx 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*))

1 Ответ

1 голос
/ 25 марта 2012

Из приглашения Сванте я обнаружил, что мне нужно было убедиться, что функция, возвращаемая TRANSFORM-PAINTER, действительно вызвала с FUNCALL и прошла FR, когда метки PAINT-UP и PAINT-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)))))
...