Lisp 方案符号等价

Lisp 方案符号等价,lisp,scheme,symbols,racket,equivalence,Lisp,Scheme,Symbols,Racket,Equivalence,我正在使用的平台是DrScheme 我已经看到一对a b[由cons a b构造]在语言中实现,就像一个过程,如下所示: (define (cons a b) (lambda(pick) (cond ((= pick 1) a) ((= pick 2) b)))) 和选择器: (define (car x) (x 1)) (define (cdr x) (x 2)) 然后是列表,用cons a cons b cons c cons等表达式构建 现在,我想了解的

我正在使用的平台是DrScheme

我已经看到一对a b[由cons a b构造]在语言中实现,就像一个过程,如下所示:

(define (cons a b)
  (lambda(pick)
    (cond ((= pick 1) a)
          ((= pick 2) b))))
和选择器:

(define (car x) (x 1))
(define (cdr x) (x 2))
然后是列表,用cons a cons b cons c cons等表达式构建

现在,我想了解的是,在DrScheme的提示符下键入了以下内容:

> (define l1 '(a b c))
> (define l2 (list 'a 'b 'c))
> l1
(a b c)
> l2
(a b c)
> (eq? l1 l2)
#f
好的,l2只是一个列表,也就是一个过程,等等。。。就像我描述的住所,但是。。。l1是什么?象征?一系列的人物?不管它是什么,它是如何在语言中实现的? 谢谢

l1也只是一个包含相同元素的列表。请注意,这也会返回f:

当返回t时:

原因是情商?检查l1和l2是否是对内存中相同对象的引用,但是否相等?检查它们是否具有相同的内容。

l1也只是包含相同元素的列表。请注意,这也会返回f:

当返回t时:

原因是情商?检查l1和l2是否是对内存中相同对象的引用,但是否相等?检查它们是否有相同的内容。

列表不是原子,这是这里的重要部分。尽管符号是原子,这意味着当它们相同时,它们驻留在相同的内存中,它们就像数字一样,确实可以被视为指针。符号也不可变,符号foo类似于数字3

然而,列表不是原子,具有相同内容的向量的两个列表或字符串可以很好地驻留在内存的两个不同位置

情商?仅对内存位置进行测试。eqv?等价性测试,这是模糊的,取决于哪个实现,方案标准对此相当自由,它只说它至少必须是eq的超集?大体上相同的另一方面,测试结构相等性并递归地进行,因此这是一个非常昂贵的操作,这就是为什么标识符通常首选符号而不是字符串

(define l1 (list 1 2 3))
(define l2 (list 1 2 3))
(eq? l1 l2) ; ===> #f in most implementations
(equal? l1 l2) ; ===> #t in all implementations
(eqv? l1 l2) ; ===> #t in some implementations
(define l3 (cdr l1))
(define l4 (cdr l1))
(eq? l3 l4) ; ===> #t, this means that they 'share memory', if you change l3 or l4, l1 will change with it, beware. This is how car and cdr work, they do not copy.
(define l6 (cons 1 l4));
(eq? l1 l6) ; ===> #f again, cons does allocate new memory, but the tails may very well share it, s in this case, l6 does share its tail with all lists except l2 here in memory. 
还有一点术语,cons创建了一对,这与两个元素的列表不同,它创建了一对。b列表a实际上与a对相同。b

此外,cons、car和cdr都是原语,您在下面看到的实现是计算机程序的结构和实现演示,表明它们不是严格需要的,但将它们作为原语可以显著提高性能,因此最好不要重新定义cons、car和cdr。

列表不是原子,这是这里最重要的部分。尽管符号是原子,这意味着当它们相同时,它们驻留在相同的内存中,它们就像数字一样,确实可以被视为指针。符号也不可变,符号foo类似于数字3

> > (define l1 '(a b c))
> > (define l2 (list 'a 'b 'c))
> > l1 (a b c)
> > l2 (a b c)
> > (eq? l1 l2)
> #f
然而,列表不是原子,具有相同内容的向量的两个列表或字符串可以很好地驻留在内存的两个不同位置

情商?仅对内存位置进行测试。eqv?等价性测试,这是模糊的,取决于哪个实现,方案标准对此相当自由,它只说它至少必须是eq的超集?大体上相同的另一方面,测试结构相等性并递归地进行,因此这是一个非常昂贵的操作,这就是为什么标识符通常首选符号而不是字符串

(define l1 (list 1 2 3))
(define l2 (list 1 2 3))
(eq? l1 l2) ; ===> #f in most implementations
(equal? l1 l2) ; ===> #t in all implementations
(eqv? l1 l2) ; ===> #t in some implementations
(define l3 (cdr l1))
(define l4 (cdr l1))
(eq? l3 l4) ; ===> #t, this means that they 'share memory', if you change l3 or l4, l1 will change with it, beware. This is how car and cdr work, they do not copy.
(define l6 (cons 1 l4));
(eq? l1 l6) ; ===> #f again, cons does allocate new memory, but the tails may very well share it, s in this case, l6 does share its tail with all lists except l2 here in memory. 
还有一点术语,cons创建了一对,这与两个元素的列表不同,它创建了一对。b列表a实际上与a对相同。b

此外,cons、car和cdr都是原语,您在下面看到的实现是计算机程序的结构和实现演示,表明它们不是严格需要的,但将它们作为原语可以显著提高性能,因此最好不要重新定义cons、car和cdr

> > (define l1 '(a b c))
> > (define l2 (list 'a 'b 'c))
> > l1 (a b c)
> > l2 (a b c)
> > (eq? l1 l2)
> #f
好的,l2只是一个列表,也就是一个过程,等等。。。就像我描述的那样 住所,但是。。。l1是什么?象征?一系列的人物?不管怎样 是,它是如何在语言中实现的?谢谢

定义的形式如下:

定义

在运行时对表达式求值,结果是一个值。 该值存储在内存中的某个位置。要在中使用此值 在其他计算中,可以使用名称。术语学是这样的 是绑定到该值的

需要注意的重要一点是,该名称仅出现在您的 源代码。它在运行时不存在。询问l1的名称是否为 因此,符号毫无意义

编译器翻译定义的一种可能策略 如下所示,忽略方案实现具有垃圾收集

为指针p保留一个存储单元m 计算v值的输出代码 将包含v的存储单元的地址存储在存储单元m中。 请注意,该名称不显示在此列表中

好的,l2只是一个列表,也就是一个过程,等等。。。锂 就像我描述的那样 住所,但是。。。l1是什么?象征?一系列的人物?不管怎样 是,它是如何在语言中实现的?谢谢

定义的形式如下:

定义

在运行时对表达式求值,结果是一个值。 该值存储在内存中的某个位置。要在中使用此值 在其他计算中,可以使用名称。术语学是这样的 是绑定到该值的

需要注意的重要一点是,该名称仅出现在您的 源代码。它在运行时不存在。询问l1的名称是否为 因此,符号毫无意义

编译器翻译定义的一种可能策略 如下所示,忽略方案实现具有垃圾收集

为指针p保留一个存储单元m 计算v值的输出代码 将包含v的存储单元的地址存储在存储单元m中。
请注意,该名称未出现在此列表中。

不应等于?返回t?这样我就可以想象符号是不是C指针了?@Metz:这与符号无关。如果你有数字列表而不是符号列表,情况也是如此。@Metz:是的,从C的角度来看,l1和l2是包含指针的变量。但是你不能对它们做任何指针运算。不应该等于?返回t?这样我就可以想象符号是不是C指针了?@Metz:这与符号无关。如果你有数字列表而不是符号列表,情况也是如此。@Metz:是的,从C的角度来看,l1和l2是包含指针的变量。当我问l1是什么的时候,我指的是l1的内容,这里的内容是:'ABC。对不起,我理解这是含糊不清的。然而,为了清楚的解释,+1。当我问l1是什么时,我指的是l1的内容,这里的内容是:'ABC。对不起,我理解这是含糊不清的。然而,+1表示清楚的解释。