作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在《计算机程序的结构和解释》一书中,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)
返回一个列表但不应该
get
期望单个符号作为
(get op type-tags)
中的第二个参数?
最佳答案
在前面 install-polar-package
的定义中您会看到每个程序的“签名”是一个列表:
...
(put 'real-part '(polar) real-part)
(put 'imag-part '(polar) imag-part)
(put 'magnitude '(polar) magnitude)
...
即,在每种情况下都是
'(polar)
不是
'polar
放在表中,所以为了匹配这个我们需要通过
'(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
表中的签名可以通过类似
equals?
的程序完成。 , 引入 int
Ex 2.54 ,测试结构平等。 IE。这两个列表的内容是等价的。
关于scheme - 不清楚 get 过程如何在 apply-generic (SICP) 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62746375/
我是一名优秀的程序员,十分优秀!