不清楚 get 过程在 apply-generic (SICP) 中是如何工作的
Unclear how the get procedure works inside apply-generic (SICP)
在计算机程序的结构和解释一书中,Section 2.4.3,它说:
(get <op> <type>)
looks up <op>,<type> entry in the table and returns the item found there.
和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)
returns 一个列表,但 get
不应期望单个符号作为其在 (get op type-tags)
中的第二个参数?
在前面的 install-polar-package
定义中,您会看到每个过程的 'signature' 是一个列表:
...
(put 'real-part '(polar) real-part)
(put 'imag-part '(polar) imag-part)
(put 'magnitude '(polar) magnitude)
...
即,在每种情况下 '(polar)
,而不是 'polar
,都放在 table 中,所以要匹配这个我们需要将 '(polar)
传递给 get
.
我们现在申请的程序都是一元的。 real-part
、imag-part
和 magnitude
只接受一个参数。在下一节 2.5.1 中,我们安装了带有两个参数的过程,因此我们需要匹配两种类型,例如基本算术运算符 add
、sub
、mul
和 div
:
(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
与 table 中的签名的比较可以通过类似 equals?
的过程来完成,引入了 int Ex 2.54,它测试结构是否相等。 IE。这两个列表的内容是等价的。
在计算机程序的结构和解释一书中,Section 2.4.3,它说:
(get <op> <type>)
looks up <op>,<type> entry in the table and returns the item found there.
和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)
returns 一个列表,但 get
不应期望单个符号作为其在 (get op type-tags)
中的第二个参数?
在前面的 install-polar-package
定义中,您会看到每个过程的 'signature' 是一个列表:
...
(put 'real-part '(polar) real-part)
(put 'imag-part '(polar) imag-part)
(put 'magnitude '(polar) magnitude)
...
即,在每种情况下 '(polar)
,而不是 'polar
,都放在 table 中,所以要匹配这个我们需要将 '(polar)
传递给 get
.
我们现在申请的程序都是一元的。 real-part
、imag-part
和 magnitude
只接受一个参数。在下一节 2.5.1 中,我们安装了带有两个参数的过程,因此我们需要匹配两种类型,例如基本算术运算符 add
、sub
、mul
和 div
:
(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
与 table 中的签名的比较可以通过类似 equals?
的过程来完成,引入了 int Ex 2.54,它测试结构是否相等。 IE。这两个列表的内容是等价的。