Oop Scheme—方法调用中可选参数的语法

Oop Scheme—方法调用中可选参数的语法,oop,arguments,scheme,optional-parameters,Oop,Arguments,Scheme,Optional Parameters,我正在看编程入门课程中的一些附加练习,这是一节关于面向对象编程和Scheme的内容 我将圆定义为具有参数半径的对象。 此外,我还将面积定义为-圆-的方法 (define -circle- (lambda (r) (define area (lambda () (* pi r r))) (lambda (method-name) (cond ((eq? method-name 'area) area) (else (error '-c

我正在看编程入门课程中的一些附加练习,这是一节关于面向对象编程和Scheme的内容

我将圆定义为具有参数半径的对象。 此外,我还将面积定义为-圆-的方法

(define -circle-
  (lambda (r)
    (define area (lambda () (* pi r r)))
    (lambda (method-name)
      (cond
        ((eq? method-name 'area) area)
        (else (error '-circle- "Method not found: ~s" method-name))
        ))))
我将调用定义为将可选参数应用于对象方法的函数。 (我对这里的语法并不生气,但这是一个给定的,我想我理解它的意思是:“首先将方法应用于对象,如果你有参数,也把它们放进去”)

测试示例(在DrRacket/Pretty Big中完美工作)是:

但在我看来,这次关闭将带来:

(call -circle- 3 'area)
而不是:

(call -circle- 'area . 3)
(这进而导致
非法使用“.”
错误)

有人能解释一下在这种情况下,带有可选参数的输入是如何工作的吗?

(-circle-3)
结果如下:

(lambda (method-name)
  (cond ((eq? method-name 'area) area)
        (else (error '-circle- "Method not found: ~s" method-name))))
区域设置为
(lambda()(*pi 3))
。这意味着
((-circle-3)”区域的返回值也是
(lambda()(*pi3))

调用
(call(-circle-3)'area)
(apply((-circle-3)'area)
具有相同的效果(因为其余参数
args
为空),这与计算
((-circle-3)'area)
相同,我们知道它与
((lambda()(*pi3))
相同,后者的计算结果为
(*pi3)

注:
(调用(-circle-3)'区域)
(调用-circle-3'区域)
不同
(-circle-3)
的结果与此相同:

(lambda (method-name)
  (cond ((eq? method-name 'area) area)
        (else (error '-circle- "Method not found: ~s" method-name))))
区域设置为
(lambda()(*pi 3))
。这意味着
((-circle-3)”区域的返回值也是
(lambda()(*pi3))

调用
(call(-circle-3)'area)
(apply((-circle-3)'area)
具有相同的效果(因为其余参数
args
为空),这与计算
((-circle-3)'area)
相同,我们知道它与
((lambda()(*pi3))
相同,后者的计算结果为
(*pi3)

注:
(调用(-circle-3)'区域)
(调用-circle-3'区域)
不同
(-circle-3)
的结果与此相同:

(lambda (method-name)
  (cond ((eq? method-name 'area) area)
        (else (error '-circle- "Method not found: ~s" method-name))))
区域设置为
(lambda()(*pi 3))
。这意味着
((-circle-3)”区域的返回值也是
(lambda()(*pi3))

调用
(call(-circle-3)'area)
(apply((-circle-3)'area)
具有相同的效果(因为其余参数
args
为空),这与计算
((-circle-3)'area)
相同,我们知道它与
((lambda()(*pi3))
相同,后者的计算结果为
(*pi3)

注:
(调用(-circle-3)'区域)
(调用-circle-3'区域)
不同
(-circle-3)
的结果与此相同:

(lambda (method-name)
  (cond ((eq? method-name 'area) area)
        (else (error '-circle- "Method not found: ~s" method-name))))
区域设置为
(lambda()(*pi 3))
。这意味着
((-circle-3)”区域的返回值也是
(lambda()(*pi3))

调用
(call(-circle-3)'area)
(apply((-circle-3)'area)
具有相同的效果(因为其余参数
args
为空),这与计算
((-circle-3)'area)
相同,我们知道它与
((lambda()(*pi3))
相同,后者的计算结果为
(*pi3)


注意:
(call(-circle-3)'区域)
(call-circle-3'区域)

首先要知道的是,点符号将零个或多个项目作为列表绑定到点后的名称

(define (exmaple a b .c) c)
(example 1 2 3 4 5) --> (3 4 5)
其次,除非您使用文字,否则不能使用文本。将x定义为y时,y将在与x关联之前进行计算。C1不是
”(-circle-3)
它是使用参数3计算-circle的结果,参数3是函数
(lambda(方法名称)…)
,在称为radius的变量为3的环境中


所以
(称c1'区域)
所做的是计算
((lambda(方法名称)…)'区域)
,其中半径为3。它返回
(lambda()(*pirr))
,其中半径为3。Apply然后将该函数应用于空列表(该函数没有形式参数,因此是合适的),该列表返回9*pi的结果。首先,您应该知道的是点符号将零个或多个项绑定到点后面的名称作为列表

(define (exmaple a b .c) c)
(example 1 2 3 4 5) --> (3 4 5)
其次,除非您使用文字,否则不能使用文本。将x定义为y时,y将在与x关联之前进行计算。C1不是
”(-circle-3)
它是使用参数3计算-circle的结果,参数3是函数
(lambda(方法名称)…)
,在称为radius的变量为3的环境中


所以
(称c1'区域)
所做的是计算
((lambda(方法名称)…)'区域)
,其中半径为3。它返回
(lambda()(*pirr))
,其中半径为3。Apply然后将该函数应用于空列表(该函数没有形式参数,因此是合适的),该列表返回9*pi的结果。首先,您应该知道的是点符号将零个或多个项绑定到点后面的名称作为列表

(define (exmaple a b .c) c)
(example 1 2 3 4 5) --> (3 4 5)
其次,除非您使用文字,否则不能使用文本。将x定义为y时,y将在与x关联之前进行计算。C1不是
”(-circle-3)
它是使用参数3计算-circle的结果,参数3是函数
(lambda(方法名称)…)
,在称为radius的变量为3的环境中

所以
(称c1'区域)
所做的是评估
((lam