我正在尝试编写不使用cons,car和cdr的对的表示,但仍然遵循对的属性,即(car (cons x y))
应为x
且(cdr (cons x y))
应为{ {1}}。所以这是我从SCIP书中得到的一个解决方案:
y
我能够写另一个解决方案,但它只能允许数字:
(define (special-cons x y)
(lambda (m) (m x y)))
是否有任何其他解决方案允许任何对象x和对象y配对?
P.S。如果不应该使用对标记,那么,为什么它在标记列表中呢?
答案 0 :(得分:2)
结构(球拍)或记录类型(R6RS)怎么样?
在球拍中:
#lang racket
(struct cell (x y))
(define (ccons x y) (cell x y))
(define (ccar cl) (cell-x cl))
(define (ccdr cl) (cell-y cl))
(define (cpair? cl) (cell? cl))
(define x (ccons 1 2))
(cpair? x)
=> #t
(ccar (ccons 1 2))
=> 1
(ccdr (ccons 3 4))
=> 4
答案 1 :(得分:2)
这是一种很好的方法。
#lang racket
(define (my-cons x y)
(lambda (p)
(if (= p 1) x y)))
(define (my-car pair)
(pair 1))
(define (my-cdr pair)
(pair 2))
这是测试
> (my-car (my-cons 1 '(2 3 4)))
1
> (my-cdr (my-cons 1 '(2 3 4)))
'(2 3 4)
答案 2 :(得分:0)
来自Structure and Interpretation of Computer Programs (section 2.1.3)的经典Ableson和Sussman程序实现:
(define (cons x y)
(define (dispatch m)
(cons ((= m 0) x)
((= m 1) y)
(else (error "Argument not 0 or 1 -- CONS" m))))
dispatch)
(define (car z)
(z 0))
(define (cdr z)
(z 1))
Rptx的解决方案大致相同,提供参考。