复合对象不适用

时间:2015-11-12 05:11:52

标签: scheme mit-scheme

我正在为MIT-Scheme编写一个小型绘图工具。 来源: [plotlib]

顶层是(make-plot output mode args)函数,它接收输出设备对象,绘图模式以及包含模式中指定的绘图类型参数的列表。 我将使用函数(range start stop increment)为每个增量生成从包含开始到独占停止的列表。 (range -1 1 .1)创建列表(-1 -.9 -.8 ... .9)

make-plot适用于其他模式,但在使用'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的一种模式打印矢量字段,它调用函数(vector-field-plot output line-color 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))))))

返回The object (#[compound procedure ]) is not applicable.

但如果我使用:

(vector-field-plot window "red" (range -1 1 .1) (range -1 1 .1) 
                                (lambda (x y) (cons (* -.1 y) (*  .1 x))))

它在图形窗口中显示正确的绘图(圆形矢量场)。 output

2 个答案:

答案 0 :(得分:2)

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

你应该改变:

(func   (cddr (cadddr args))))

使用:

(func   (caddr (cadddr args))))

答案 1 :(得分:0)

约旦,

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

你做了什么来解决它?

由于