关于点"。"在计划中

时间:2014-05-12 23:03:03

标签: scheme symbols

我看到有other questions关于点"。" 我跟着但它没有为我的代码工作.... 它是代码的一部分,实现并不专注于此符号。 但输出应该包括在这个点。 当我输入两个列表'(1 2 3)'(4 5) 我的预期输出=> (1.4)(2.5)

我设法得到(1 4)(2 5) 只需要添加"。"在中间。

Part of mycode 
(cons (list (car lst1) (car lst2))
....

用于"。"符号,如果我尝试

**trial-1**
 (cons '(list (car lst1) (car lst2)) ...)
输出:((list(car lst1)(car lst2))

**trail-2**
(cons (list (car lst1) '. (car lst2)) ...)

然后..它说:非法使用`。'

使用点的规则是什么?我能看到的任何文件? 顺便说一下,我正在使用Racket(R5RS)。

4 个答案:

答案 0 :(得分:2)

当您构建{emis 时,会显示点符号(意思是:它不以空列表结束)。例如:

cons

例如,要显示问题中显示的输出,请尝试以下方法:

(cons 1 2) 
=> (1 . 2) ; a cons-pair

(cons 1 (cons 2 (cons 3 4)))
=> '(1 2 3 . 4) ; an improper list

答案 1 :(得分:2)

虽然.可以是符号的一部分,但.本身并不是有效符号。 .在列表结构中用作carcdr之间的分隔符。例如。 (a . (b . (c . ()))) ; ==> (a b c)

实际应用程序是历史用作程序原型中的rest参数,您可以将其用作宏的转换模板。另外,read可以读取它,您可以将其用作(define lst '((a) . (b)))等数据。

所以回顾一下:

(a . b)是一对ab,而(a.b)(a.b . ())相同,因此一对符号a.b和空列表。

至于如何创建一对,请使用cons(cons 'a 'b) => (a . b) (list a b) => (cons 'a (cons b '()))。现在,您可以将两个列表作为参数(cons '(1 4) '(2 5))进行配对,但如果您打印它,则表示(a . (b))(a b)相同,因此(cons '(1 4) '(2 5))将显示为{{ 1}}因为它不希望显示点。如果它更喜欢显示点,它会显示为((1 4) 2 5),因为那个数据结构中有多少对。

如果您设法获得输出((1 . (4 . ())) . ((2 . (5 . ()))))并且真的需要((1 4) (2 5)),则需要将((1 . 4) (2 . 5))替换为list

答案 2 :(得分:1)

它被称为虚线对,当您cons具有非列表的项目时生成,例如:

> (cons 1 2)
(1 . 2)

请参阅:http://download.plt-scheme.org/doc/html/guide/Pairs__Lists__and_Scheme_Syntax.html

答案 3 :(得分:1)

来自R7RS:

  

Scheme对的最一般表示法(外部表示)   是“虚线”符号(c1.c2),其中c1是汽车的价值   field和c2是cdr字段的值。例如(4.5)是a   汽车为4且cdr为5的对。注意(4.5)是   一对的外部表示,而不是一个评估的表达式   一对。

.不是符号。