Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
30 lines (25 sloc) 1.39 KB
(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))
        (if (= (length args) 2)
          (let ((type1 (car type-tags))
                (type2 (cdr type-tags))
                (a1 (car args))
                (a2 (cdr args)))
            (let ((t1->t2 (get-coercion type1 type2))
                  (t2->t1 (get-coercion type2 type1)))
              (cond
                (t1->t2 (apply-generic op (t1->t2 a1) a2))
                (t2->t1 (apply-generic op a1 (t2->t1 a2)))
                (else (error "No method for these types" (list op type-tags))))))
          (error "No method for these types" (list op type-tags)))))))

a)

可以看到,如果在(get op type-tags)这一边取不到相应操作,并且参数个数为2个,就会进行相应转化,而Louis增加了同类型的转化,在这里也就是t1->t2存在,所有会调用(apply-generic op (t1->t2 a1) a2),而这又会重复上面的操作,造成死循环。

b)

Louis想解决同类转化问题而引入的解决方法不仅没能解决问题,反而使程序造成了无限递归的情况,所有Louis的做法是不对的。正确的修改方式见下一小问。

c)

如果改的话,很简单,就是在进行类型转化之前判断下(eq? type1 type2),为false的情况才进行转化。