Scheme 复合对象不适用

Scheme 复合对象不适用,scheme,mit-scheme,Scheme,Mit Scheme,我正在为麻省理工学院的计划编写一个小型绘图工具来源: 顶层是(生成打印输出模式args)函数,该函数接收输出设备对象、打印模式和包含模式中指定打印类型参数的列表。 我将使用函数(范围开始-停止增量)为每个增量从包含的开始到独占的停止生成列表(范围-11.1)创建列表(-1-.9-.8…9) makeplot适用于其其他模式,但在使用的vector-field-plot调用时不起作用 (define window (make-graphics-device 'win32)) (define (v

我正在为麻省理工学院的计划编写一个小型绘图工具来源:

顶层是
(生成打印输出模式args)
函数,该函数接收输出设备对象、打印模式和包含模式中指定打印类型参数的列表。 我将使用函数
(范围开始-停止增量)
为每个增量从包含的开始到独占的停止生成列表<代码>(范围-11.1)创建列表
(-1-.9-.8…9)

makeplot
适用于其其他模式,但在使用
的vector-field-plot调用时不起作用

(define window (make-graphics-device 'win32))

(define (vector-field-plot device color xrange yrange func) 
  (let* ((cords (append-all (map (lambda (i) 
                                   (map (lambda (j) 
                                          (cond ((eq? j '()) '()) 
                                                (else (cons i j)))) 
                                        xrange)) 
                                  yrange))) 
         (input (map (lambda (point) 
                       (list (car point) (cdr point) 
                             (car (func (car point) (cdr point))) 
                             (cdr (func (car point) (cdr point))))) 
                     cords))) 
    (draw-vector-list device color input)))

;This is the part of make-plot that is called for 
;(make-plot window 'vector-field-plot '(args))

((eq? mode 'vector-field-plot)
       ;does not work yet
        (let* ((bg-color (car args))
               (grid-color (cadr args))
               (line-color (caddr args))
               (xrange (car (cadddr args)))
               (yrange (cadr (cadddr args)))
               (func   (cddr (cadddr args))))
         (clear output bg-color);sets background to white
         (coord-grid-cart output grid-color);prints Cartesian coordinate grid
         (vector-field-plot output line-color xrange yrange func)))))
         ;calls vector-field-plot with parameters given to make-plot
;I have left out some function definitions here, they are in the source file
;but you can assume all of those work correctly for this section
make plot
的一种模式打印向量场,它调用函数
(向量场打印输出线颜色xrange yrange func)
,其中xrange和yrange是像
'(-1-.9…1)
这样的数字列表,形式为
(lambda(x y)(cons x y))
。如果我使用:

(make-plot window 'vector-field-plot (list "white" "black" "red"
                                           (list (range -1 1 .1) (range -1 1 .1) 
                                           (lambda (x y) (cons (* -.1 y) (* -.1 x))))))
它返回
对象(#[复合过程])不适用。

但如果我使用:

(vector-field-plot window "red" (range -1 1 .1) (range -1 1 .1) 
                                (lambda (x y) (cons (* -.1 y) (*  .1 x))))
它在图形窗口中显示正确的绘图(圆形向量场)。

错误是因为用于获取参数列表之外的函数的表达式返回一个包含函数的列表,而不是函数本身

您应该更改:

(func   (cddr (cadddr args))))
与:

约旦

我正在尝试解决Windows 10上的LNK1168错误,该错误与您几个月前在问题中描述的相同。我没有其他方式与你联系,因为你显然从那时起就一直在编码,我想你已经解决了这个问题

你做了什么来修复它


约旦考虑使用<代码>第三< /代码>(或<代码>第四代码>)代替“代码> CADDRD</代码>。我将很快重写使用<代码>列表REF。实际上,我有一些想法将其压缩50%左右的SLOC。这将使输入更简单,因为您可以使用平面参数列表调用makeplot,而不是包含另一个列表的列表。或者我将使用可选参数。这是一个查看mit/gnu方案实现中图形操作功能的快速实现。发生的情况是,您正在调试模式下运行程序,但没有正确退出程序。调试器将自身附加到程序正在运行的进程,如果过早退出程序(点击窗口上的x),调试器将变得不稳定。要提前终止程序,您需要做的是点击调试器工具栏中的红色按钮,以便调试器可以正确关闭它。否则,您需要等待程序正常终止。否则,请在不调试的情况下运行程序。
(func   (caddr (cadddr args))))