标签中定义的Lambda不创建函数?不执行?

标签中定义的Lambda不创建函数?不执行?,lambda,common-lisp,sbcl,sicp,Lambda,Common Lisp,Sbcl,Sicp,在使用Steel Bank Common Lisp处理SICP时,我取得了合理的成功,但在“图片语言”示例中遇到了一个障碍。下面的内容似乎没有写入PPM文件,而我编写的其他旋转和翻转则写入PPM文件。我怀疑LAMBDA在调用内部标签时不知何故没有返回函数 我已经做了M-x检查,没有什么是孤立的,也没有什么看起来不舒服的 (defun below (painter1 painter2) "Divides frame along 2nd axis and invokes a painter on

在使用Steel Bank Common Lisp处理SICP时,我取得了合理的成功,但在“图片语言”示例中遇到了一个障碍。下面的内容似乎没有写入PPM文件,而我编写的其他旋转和翻转则写入PPM文件。我怀疑LAMBDA在调用内部标签时不知何故没有返回函数

我已经做了M-x检查,没有什么是孤立的,也没有什么看起来不舒服的

(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*))

从Svante的提示中,我发现答案是,我需要确保TRANSFORM-PAINTER返回的函数实际上是使用FUNCALL调用的,并在调用标签PAINT-UP和PAINT-DOWN时传递FR。下面更正的函数如下所示:

(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)))))

从Svante的提示中,我发现答案是,我需要确保TRANSFORM-PAINTER返回的函数实际上是使用FUNCALL调用的,并在调用标签PAINT-UP和PAINT-DOWN时传递FR。下面更正的函数如下所示:

(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)))))

已测试并运行的功能:INIT-BUFFER、TRANSFORM-PAINTER、MAKE-VECT、MAKE-FRAME、SEGMENTS->PAINTER、RGB-BUFFER->PPMDo是否收到任何错误消息?为什么不在
paint-
函数中使用
fr
?没有错误。我没有使用FR,因为TRANSFORM-PAINTER返回一个将其作为参数的函数。答案是,我需要确保TRANSFORM-PAINTER返回的函数实际上是用FUNCALL调用的,并且在调用标签PAINT-UP和PAINT-DOWN时传递了FR。谢谢你的提示,斯万特!当自我回答的冷却时间过去后,我会发布答案。已测试并正在运行的功能:INIT-BUFFER、TRANSFORM-PAINTER、MAKE-VECT、MAKE-FRAME、SEGMENTS->PAINTER、RGB-BUFFER->PPMDo是否收到任何错误消息?为什么不在
paint-
函数中使用
fr
?没有错误。我没有使用FR,因为TRANSFORM-PAINTER返回一个将其作为参数的函数。答案是,我需要确保TRANSFORM-PAINTER返回的函数实际上是用FUNCALL调用的,并且在调用标签PAINT-UP和PAINT-DOWN时传递了FR。谢谢你的提示,斯万特!当自我回答的冷却时间过去后,我会发布答案。