【问题标题】:Scheme - Syntax of optional arguments in a method callScheme - 方法调用中可选参数的语法
【发布时间】:2015-01-23 08:09:47
【问题描述】:

我正在查看编程入门课程中的一些额外练习,这是来自关于带有 Scheme 的 OOP 的一节。

我将 -circle- 定义为具有参数半径的对象。 另外,我将区域定义为 -circle- 的方法。

(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))
        ))))

我将 call 定义为将可选参数应用于对象方法的函数。 (我并不讨厌这里的语法,但这是给定的,我想我理解的意思是:“首先将方法应用于对象,如果你有参数,也将它们放入”)。

(define call
  (lambda (obj method-name . args)
    (apply (obj method-name) args)))

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

(define c1 (-circle- 3))
(call c1 'area)

但在我看来,这种关闭会带来:

(call -circle- 3 'area)

代替:

(call -circle- 'area . 3)

(这又会导致illegal use of '.' 错误)。

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

【问题讨论】:

    标签: oop arguments scheme optional-parameters


    【解决方案1】:

    (-circle- 3) 的结果是这样的:

    (lambda (method-name)
      (cond ((eq? method-name 'area) area)
            (else (error '-circle- "Method not found: ~s" method-name))))
    

    area 设置为(lambda () (* pi 3 3))。也就是说((-circle- 3) 'area)的返回值也是(lambda () (* pi 3 3))

    (call (-circle- 3) 'area) 的调用与(apply ((-circle- 3) 'area) '()) 具有相同的效果(因为其余参数args 为空),这与评估(((-circle- 3) 'area)) 相同,我们知道与@987654331 相同@,计算结果为 (* pi 3 3)

    注意:(call (-circle- 3) 'area) (call -circle- 3 'area) 相同。

    【讨论】:

    • 我会选择两个答案,但我选择了 WorBlux,因为他/她的分数较低。
    • @maja 少是什么意思?他们有 824,我有 114! ;-) ;-) ;-)
    【解决方案2】:

    您应该知道的第一件事是点符号将零个或多个项目绑定到点后面的名称作为列表。

    (define (exmaple a b .c) c)
    (example 1 2 3 4 5) --> (3 4 5)
    

    其次定义不是'文本',除非你使用文字。当您将 x 定义为 y 时,在与 x 关联之前评估 y。 C1 不是'(-circle- 3),它是使用参数 3 评估 -circle- 的结果,它是在名为 radius 的变量为 3 的环境中的函数 (lambda (method-name) ...)

    所以(call c1 'area) 所做的是评估((lambda (method-name) ...) 'area),其中半径为三。它返回(lambda () (* pi r r)),其中半径为 3。Apply 然后将该函数应用于返回 9*pi 的结果的空列表(因为该函数没有正式参数,所以很合适)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2013-07-03
      • 2015-07-12
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 2019-03-08
      相关资源
      最近更新 更多