对的表示

时间:2014-10-18 21:58:03

标签: scheme racket

我正在尝试编写不使用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。如果不应该使用标记,那么,为什么它在标记列表中呢?

3 个答案:

答案 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的解决方案大致相同,提供参考。