Scheme 修改函数中的结构字段?

Scheme 修改函数中的结构字段?,scheme,mit-scheme,Scheme,Mit Scheme,我正在学习如何使用MIT scheme的结构,并尝试将以下函数从C“翻译”到scheme: static inline void body_integrate(struct body *body, double dt) { body->vx += dt * body->fx / body->mass; body->vy

我正在学习如何使用MIT scheme的结构,并尝试将以下函数从C“翻译”到scheme:

static inline void
body_integrate(struct body *body, double dt)
{                                                                         
  body->vx += dt * body->fx / body->mass;
  body->vy += dt * body->fy / body->mass;
  body->rx += dt * body->vx;
  body->ry += dt * body->vy;                                        
}
使用以下定义

(define-structure body rx ry vx vy fx fy mass)

(define integrate (lambda (body dt) (
  (set-body-vx! body (+ (body-vx body) (* dt (/ (body-fx body) (body-mass body)))))
  (set-body-vy! body (+ (body-vy body) (* dt (/ (body-fy body) (body-mass body)))))
  (set-body-rx! body (+ (body-rx body) (* dt (body-vx body))))
  (set-body-ry! body (+ (body-ry body) (* dt (body-vy body))))
)))
我得到:

MIT/GNU Scheme running under GNU/Linux
Type `^C' (control-C) followed by `H' to obtain information about interrupts.

Copyright (C) 2011 Massachusetts Institute of Technology
This is free software; see the source for copying conditions. There is NO warranty; not even for
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Image saved on Thursday November 5, 2015 at 8:44:48 PM
  Release 9.1.1 || Microcode 15.3 || Runtime 15.7 || SF 4.41 || LIAR/x86-64 4.118 || Edwin 3.116
;Loading "body.ss"... done

1 ]=> (define b (make-body 1.0 1.0 2.0 2.0 10.0 10.0 0.1))

;Value: b

1 ]=> (integrate b 5.0)    

;The object #!unspecific is not applicable.
;To continue, call RESTART with an option number:
; (RESTART 2) => Specify a procedure to use in its place.
; (RESTART 1) => Return to read-eval-print level 1.

2 error> 

我有种感觉,我无法在
集成
内部执行多个
(set-body-X!…)
。但是,我应该如何继续这样做呢?

第一行末尾的右括号不正确,在Scheme中,当用
()
包围表达式时,它被视为函数应用程序,而这不是您想要的

无论如何,用新的值创建一个新的结构,而不是修改一个参数,这将更为惯用——记住,Scheme鼓励函数式编程风格,并且您应该避免改变值;此外,在大多数编程语言中,修改参数被认为是不好的风格(不过在C语言中这是可以的)。试试这个:

(define (integrate body dt)
  (make-body (+ (body-rx body) (* dt (body-vx body)))
             (+ (body-ry body) (* dt (body-vy body)))
             (+ (body-vx body) (* dt (/ (body-fx body) (body-mass body))))
             (+ (body-vy body) (* dt (/ (body-fy body) (body-mass body))))
             (body-fx body)
             (body-fy body)
             (body-mass body)))

在你的羔羊身上有一套额外的帕伦。删除它们,您的代码应该可以正常工作。可能存在重复的