Scheme 成对表示

Scheme 成对表示,scheme,racket,Scheme,Racket,我试图编写一个不使用cons、car和cdr的对表示,但仍然遵循对的属性,即car cons x y应该是x,cdr cons x y应该是y。这是我从SCIP书中得到的一个解决方案: (define (special-cons x y) (lambda (m) (m x y))) 我可以编写另一个解决方案,但它只能允许数字: (define (special-cons a b) (* (expt 2 a) (expt 3 b))) (define (num-divs

我试图编写一个不使用cons、car和cdr的对表示,但仍然遵循对的属性,即car cons x y应该是x,cdr cons x y应该是y。这是我从SCIP书中得到的一个解决方案:

(define (special-cons x y) 
   (lambda (m) (m x y)))
我可以编写另一个解决方案,但它只能允许数字:

(define (special-cons a b)
  (* (expt 2 a)
     (expt 3 b)))

(define (num-divs n d)
  (define (iter x result)
    (if (= 0 (remainder x d))
        (iter (/ x d) (+ 1 result))
        result))
  (iter n 0))

(define (special-car x)
  (num-divs x 2))

(define (special-cdr x)
  (num-divs x 3))
是否有其他解决方案允许对任何对象x和对象y进行配对


另外,如果不应该使用pairs标签,那么为什么它会出现在标签列表中?

structs Racket或record Type 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

structs Racket或唱片类型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

这是一个很好的方法

#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)

这是一个很好的方法

#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)

经典的Ableson和Sussman程序实施来自:


Rptx的解决方案大致相当,本文仅供参考。

经典的Ableson和Sussman程序实现来自:


Rptx的解决方案大致相当,本文仅供参考。

您使用的是哪种实现?我不理解您的问题。你能详细说明一下吗?我的解决方案是成对的数字。我正在尝试对任何对象进行实现,我想知道您使用的是什么方案实现——是Racket、Chicken、Bigloo、Guile、Gambit还是其他?这是一个有趣的问题,但对于堆栈溢出来说太宽泛了:可能的答案太多,或者好的答案对于这种格式来说太长。有很多方法可以表示成对:如你所提到的,用数字表示;词法闭包,正如您在SICP中看到的;记录数据结构;二元阵列;具有某种值的字符串->字符串编码;这也取决于语言的实现。使用符号解释器,您不需要任何实现,只需要公理或简化规则:carconsxy↦ x和cdr cons x y↦ y、 难道你不想将任何东西转换成数字或带有数字的特殊CON吗?用户不知道实现如何对所有对象进行编码,但是如果你要进行cons,你会弄脏你的手。你使用的是哪种实现?我不理解你的问题。你能详细说明一下吗?我的解决方案是成对的数字。我正在尝试对任何对象进行实现,我想知道您使用的是什么方案实现——是Racket、Chicken、Bigloo、Guile、Gambit还是其他?这是一个有趣的问题,但对于堆栈溢出来说太宽泛了:可能的答案太多,或者好的答案对于这种格式来说太长。有很多方法可以表示成对:如你所提到的,用数字表示;词法闭包,正如您在SICP中看到的;记录数据结构;二元阵列;具有某种值的字符串->字符串编码;这也取决于语言的实现。使用符号解释器,您不需要任何实现,只需要公理或简化规则:carconsxy↦ x和cdr cons x y↦ y、 难道你不想将任何东西转换成数字或带有数字的特殊CON吗?用户不知道实现如何对所有对象进行编码,但如果要进行cons,则会弄脏手。@user3450695不是您要找的吗?@user3450695不是您要找的吗?