Scheme 不清楚get过程在apply generic(SICP)中是如何工作的

Scheme 不清楚get过程在apply generic(SICP)中是如何工作的,scheme,sicp,Scheme,Sicp,在《计算机程序的结构和解释》一书中,它说: (get)查找表中的条目并返回在其中找到的项 而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

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

(get)
查找表中的条目并返回在其中找到的项

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)
  ...
也就是说,在每种情况下,它都是
”(极性)
而不是
“极性”
被放在表中,因此为了匹配这一点,我们需要将
”(极性)
传递到
get

我们目前采用的程序都是一元的<代码>实部,
imag部
幅值
只取一个参数。在下一节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))))
在这些情况下,两个参数恰好是同一类型的,但是这种方法支持具有任意数量的不同类型参数的过程


类型标记
与表中的签名进行比较,可以使用类似
equals?
的程序,引入int,测试结构相等性。也就是说,这两个列表的内容是等价的。

我认为我的主要困惑来自get如何比较类型参数。我不认为平等?会有用的。