如何在函数中指定加减法?
How to specify addition and subtraction in a function?
我正在制作一个函数,从原始函数中添加或减去 x 和 y coordinates.This 函数接受命令(“左”、“右”、“上”、“下”)和(x , y) 位置,和一个非负距离,并根据命令和 distance.It 产生一个新的移动点,如“左”x-num,“右”x+num,“下”y+num ,“上”y-num。例如,如果您从 (2, 3) 开始,命令“左”1 应该产生 (1, 3),而“下”2.2 会产生 (2, 5.2)。每个部分都可能有效,但我如何将它们添加到一个函数中。
这是我的代码:
(define POSN-0 (make-posn 5 5))
(define POSN-1 (make-posn 10 10))
(define POSN-2 (make-posn 20 20))
(define (shift-left p)
(make-posn (- (posn-x p) num)
(posn-y p)))
(define (shift-right p)
(make-posn (+ (posn-x p) num)
(posn-y p)))
(define (shift-up p)
(make-posn (posn-x p)
(- (posn-y p) num)))
(define (shift-down p)
(make-posn (posn-x p)
(+ (posn-y p) num)))
如何将所有这些添加到一个函数中?另外,如何定义 add/subtract 号码?
您肯定可以为给定函数设置多个参数,实际上您可以在 +
和 -
等 built-in 函数以及构造函数中看到这一点(make-point)
(采用当前定义的四个参数)。
说起来,point
结构体的xp
和yp
成员是干什么用的?二维space中的一个点只需要两个坐标。另外两个是干什么用的?此外,(define-struct)
形式已被弃用,取而代之的是 (struct)
形式,但这在这里并不重要。
至于如何实现 'commands',假设您指的是 (command-point)
函数,您将有一个用于操作的参数,另一个用于移动距离的参数,以及一个案例分析(例如,一个 (cond)
形式,或一系列 (if)
形式,或者在这种情况下,一个 (case)
形式)打开给定的命令。类似于以下内容(未经测试的代码,您可能需要进行调整):
(define (command-point p cmd dist)
(case cmd
(`left (make-point (- (point-x1 p) 1) (point-y1 p) (point-xp p) (point-yp p)))
(`right (make-point (+ (point-x1 p) 1) (point-y1 p) (point-xp p) (point-yp p)))
(`fwd (make-point (point-x1 p) (- (point-y1 p) 1) (point-xp p) (point-yp p)))
(`back (make-point (point-x1 p) (+ (point-y1 p) 1) (point-xp p) (point-yp p)))))
请注意,这不会更改通过 p
传递的 point
;它会生成一个新的 point
结构。
我希望这就是您要找的,老实说,您的问题并不完全清楚。
经过您的编辑,您更清楚自己想要什么,所以这是我的尝试。
无论如何,当您使用特定语言时(BSL 在这种情况下),您应该在问题中提及它。这将导致对您更有用的答案。
另请参阅this similar question- 看来你们都是同一门课程的参加者,所以我建议你们联合起来,下次post一个well-thought问题而不是两个相似的。
(define (shift command p dist)
(cond
((string=? command "left")
(make-posn (- (posn-x p) dist)
(posn-y p)))
((string=? command "right")
(make-posn (+ (posn-x p) dist)
(posn-y p)))
((string=? command "up")
(make-posn (posn-x p)
(- (posn-y p) dist)))
((string=? command "down")
(make-posn (posn-x p)
(+ (posn-y p) dist)))))
示例:
> (define p0 (make-posn 2 3))
> (shift "left" p0 1)
(make-posn 1 3)
> (shift "down" p0 2.2)
(make-posn 2 5.2)
我正在制作一个函数,从原始函数中添加或减去 x 和 y coordinates.This 函数接受命令(“左”、“右”、“上”、“下”)和(x , y) 位置,和一个非负距离,并根据命令和 distance.It 产生一个新的移动点,如“左”x-num,“右”x+num,“下”y+num ,“上”y-num。例如,如果您从 (2, 3) 开始,命令“左”1 应该产生 (1, 3),而“下”2.2 会产生 (2, 5.2)。每个部分都可能有效,但我如何将它们添加到一个函数中。
这是我的代码:
(define POSN-0 (make-posn 5 5))
(define POSN-1 (make-posn 10 10))
(define POSN-2 (make-posn 20 20))
(define (shift-left p)
(make-posn (- (posn-x p) num)
(posn-y p)))
(define (shift-right p)
(make-posn (+ (posn-x p) num)
(posn-y p)))
(define (shift-up p)
(make-posn (posn-x p)
(- (posn-y p) num)))
(define (shift-down p)
(make-posn (posn-x p)
(+ (posn-y p) num)))
如何将所有这些添加到一个函数中?另外,如何定义 add/subtract 号码?
您肯定可以为给定函数设置多个参数,实际上您可以在 +
和 -
等 built-in 函数以及构造函数中看到这一点(make-point)
(采用当前定义的四个参数)。
说起来,point
结构体的xp
和yp
成员是干什么用的?二维space中的一个点只需要两个坐标。另外两个是干什么用的?此外,(define-struct)
形式已被弃用,取而代之的是 (struct)
形式,但这在这里并不重要。
至于如何实现 'commands',假设您指的是 (command-point)
函数,您将有一个用于操作的参数,另一个用于移动距离的参数,以及一个案例分析(例如,一个 (cond)
形式,或一系列 (if)
形式,或者在这种情况下,一个 (case)
形式)打开给定的命令。类似于以下内容(未经测试的代码,您可能需要进行调整):
(define (command-point p cmd dist)
(case cmd
(`left (make-point (- (point-x1 p) 1) (point-y1 p) (point-xp p) (point-yp p)))
(`right (make-point (+ (point-x1 p) 1) (point-y1 p) (point-xp p) (point-yp p)))
(`fwd (make-point (point-x1 p) (- (point-y1 p) 1) (point-xp p) (point-yp p)))
(`back (make-point (point-x1 p) (+ (point-y1 p) 1) (point-xp p) (point-yp p)))))
请注意,这不会更改通过 p
传递的 point
;它会生成一个新的 point
结构。
我希望这就是您要找的,老实说,您的问题并不完全清楚。
经过您的编辑,您更清楚自己想要什么,所以这是我的尝试。
无论如何,当您使用特定语言时(BSL 在这种情况下),您应该在问题中提及它。这将导致对您更有用的答案。
另请参阅this similar question- 看来你们都是同一门课程的参加者,所以我建议你们联合起来,下次post一个well-thought问题而不是两个相似的。
(define (shift command p dist)
(cond
((string=? command "left")
(make-posn (- (posn-x p) dist)
(posn-y p)))
((string=? command "right")
(make-posn (+ (posn-x p) dist)
(posn-y p)))
((string=? command "up")
(make-posn (posn-x p)
(- (posn-y p) dist)))
((string=? command "down")
(make-posn (posn-x p)
(+ (posn-y p) dist)))))
示例:
> (define p0 (make-posn 2 3))
> (shift "left" p0 1)
(make-posn 1 3)
> (shift "down" p0 2.2)
(make-posn 2 5.2)