我想从列表开始制作一对列表,cdr将始终相同。例如,(make-pair '(1 2 3 4 5))
应返回'((1.a)(2.a)(3.a)(4.a)(5.a))
。
这是我正在开发的代码,但它不起作用,我不知道如何调试它。
(define (make-pair lst)
(if (null? (car lst))
'()
(cons ((car lst) ".a")
(make-pair (cdr lst)))))
提前谢谢!
答案 0 :(得分:0)
你有几个错误:
(define (make-pair lst)
(if (null? (car lst)) ; - the base case is when the list is null
'()
(cons ((car lst) ".a") ; - there's a missing cons
; - `a` appears to be a symbol, not a string
; - that's not how we create a dotted pair
; - the surrounding `()` are misplaced
(make-pair (cdr lst)))))
这是正确的方法:
(define (make-pair lst)
(if (null? lst)
'()
(cons (cons (car lst) 'a)
(make-pair (cdr lst)))))
甚至更好,使用内置程序:
(define (make-pair lst)
(map (lambda (n) (cons n 'a))
lst))
无论哪种方式,它都按预期工作:
(make-pair '(1 2 3 4 5))
=> '((1 . a) (2 . a) (3 . a) (4 . a) (5 . a))