如何在函数中指定加减法?

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结构体的xpyp成员是干什么用的?二维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)