【问题标题】:Unclear how the get procedure works inside apply-generic (SICP)不清楚 get 过程如何在 apply-generic (SICP) 中工作
【发布时间】:2020-07-05 21:11:17
【问题描述】:

在《计算机程序的结构和解释》一书中,Section 2.4.3,它说:

(get <op> <type>) 在表中查找 , 条目并返回在那里找到的项目。

apply-generic 被定义为

(define (apply-generic op . args)
  (let ((type-tags (map type-tag args)))
    (let ((proc (get op type-tags)))
      (if proc
          (apply proc (map contents args))
          (error "No method for these types: APPLY-GENERIC"
                 (list op type-tags))))))

(map type-tag args) 返回一个列表,但 get 不应该期望在 (get op type-tags) 中将单个符号作为其第二个参数?

【问题讨论】:

    标签: scheme sicp


    【解决方案1】:

    install-polar-package 的上述定义中,您会看到这些过程的“签名”是一个列表:

      ...
      (put 'real-part '(polar) real-part)
      (put 'imag-part '(polar) imag-part)
      (put 'magnitude '(polar) magnitude)
      ...
    

    即,在每种情况下,'(polar),而不是'polar,都放在表中,因此为了匹配这个,我们需要将'(polar) 传递给get

    我们目前正在应用的程序都是一元的。 real-partimag-partmagnitude 只接受一个参数。在下一节 2.5.1 中,我们将安装带有两个参数的过程,因此我们需要匹配两种类型,例如基本算术运算符 addsubmuldiv:

      (put 'add '(scheme-number scheme-number)
           (lambda (x y) (tag (+ x y))))
      (put 'sub '(scheme-number scheme-number)
           (lambda (x y) (tag (- x y))))
      (put 'mul '(scheme-number scheme-number)
           (lambda (x y) (tag (* x y))))
      (put 'div '(scheme-number scheme-number)
           (lambda (x y) (tag (/ x y))))
    

    在这些情况下,两个参数恰好是同一类型,但这种方法支持具有任意数量的不同类型参数的过程。

    type-tags 与表中的签名的比较可以通过类似equals? 的过程来完成,引入了 int Ex 2.54,用于测试结构相等性。 IE。这两个列表的内容是等价的。

    【讨论】:

    • 我认为我的主要困惑来自 get 如何比较类型参数。我不认为平等?会工作的。
    最近更新 更多