为什么这个算术代码 return 列表?
Why does this arithmetic code return lists?
我目前正在努力完成 SICP 的练习 3.17。我知道我搞砸了,我打算稍后修复它。我不会 link 这个练习,因为它不相关。这是我的尝试之一:
#lang sicp
(define (count-pairs x)
(define encountered '())
(define counter 0)
(define (loop x)
(set! counter (+
(cond
((null? x) 0)
((not (pair? x)) 0)
((null? encountered) (set! encountered (list (car x))) 1)
((eq? (car x) (car encountered)) 0)
(else 1))
counter))
(if (not (pair? x)) counter (begin (loop (car x))
loop (cdr x))))
(loop x))
(count-pairs (list 'a 'b 'c))
(define second (cons 'a 'b))
(define third (cons 'a 'b))
(define first (cons second third))
(set-car! third second)
(count-pairs first)
(define 3rd (cons 'a 'b))
(define 2nd (cons 3rd 3rd))
(define 1st (cons 2nd 2nd))
(count-pairs 1st)
令我震惊的是,这个 returned:
(b c)
((a . b) . b)
((a . b) a . b)
这怎么可能?我知道这段代码甚至没有接近预期的效果,但据我所知,它应该只做算术运算,因此 return 数字。此代码如何 return 列出结构?
换一个新的IDE。 Stack Overflow 的语法突出显示使这成为一个死赠品。
(begin (loop (car x))
loop (cdr x))))
我目前正在努力完成 SICP 的练习 3.17。我知道我搞砸了,我打算稍后修复它。我不会 link 这个练习,因为它不相关。这是我的尝试之一:
#lang sicp
(define (count-pairs x)
(define encountered '())
(define counter 0)
(define (loop x)
(set! counter (+
(cond
((null? x) 0)
((not (pair? x)) 0)
((null? encountered) (set! encountered (list (car x))) 1)
((eq? (car x) (car encountered)) 0)
(else 1))
counter))
(if (not (pair? x)) counter (begin (loop (car x))
loop (cdr x))))
(loop x))
(count-pairs (list 'a 'b 'c))
(define second (cons 'a 'b))
(define third (cons 'a 'b))
(define first (cons second third))
(set-car! third second)
(count-pairs first)
(define 3rd (cons 'a 'b))
(define 2nd (cons 3rd 3rd))
(define 1st (cons 2nd 2nd))
(count-pairs 1st)
令我震惊的是,这个 returned:
(b c)
((a . b) . b)
((a . b) a . b)
这怎么可能?我知道这段代码甚至没有接近预期的效果,但据我所知,它应该只做算术运算,因此 return 数字。此代码如何 return 列出结构?
换一个新的IDE。 Stack Overflow 的语法突出显示使这成为一个死赠品。
(begin (loop (car x))
loop (cdr x))))