Scheme 成对表示
我试图编写一个不使用cons、car和cdr的对表示,但仍然遵循对的属性,即car cons x y应该是x,cdr cons x y应该是y。这是我从SCIP书中得到的一个解决方案: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
(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不是您要找的吗?