2014-05-12 48 views
0

我看到有關於點「」的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)) ...) 

則輸出:((名單(汽車LST1)(汽車LST2))

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

然後..它說:非法使用`「

什麼用點?任何文件的規則我可以​​看看? 順便說一句,我使用的球拍(R5RS)。

回答

0

當你建立一個cons點符號顯示 - 列表這是不適當(意思是:它不以空列表結束)。例如:

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

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

例如,要顯示的輸出,諸如在問題中所示的一個嘗試:

(define lst1 '(1 2 3)) 
(define lst2 '(4 5)) 

(list (cons (car lst1) (car lst2)) 
     (cons (cadr lst1) (cadr lst2))) 

=> '((1 . 4) (2 . 5)) 
+0

我的代碼是... cons(list ...和你的代碼... list(cons ... =>(我只是試着用我自己的話,看到我理解正確);因爲點當我建立cons-pair時,符號將被「自動」顯示出來,但是我的錯誤是我先建立一個列表,然後利用它,所以它不顯示虛線符號,因爲列表不適合顯示虛線符號。如果代碼先建立cons對,然後從cons對結果中建立一個列表,以便顯示虛線符號....對嗎? – user1915570

+0

@ user1915570 mmm,我最好說點符號有這是一個特殊的含義,所以你不能使用它作爲一個「正常」的符號,當你顯示具有特定結構的'cons'單元格時顯示,但你不能明確地將它添加到你的列表中 –

+0

也有你解釋「意思是:它不會以空列表結束「。究竟是什麼意思呢?因爲我的出身(代碼的一部分)...(列表(cons lst2)).... myFunc是尾遞歸部分...輸出是這樣的:(myFunc'(1 2 3)'(abc))=>((1。 a)((2。b)((3。c)())))....我最後得到空列表。 – user1915570

1

從R7RS:

最一般的表示法(外部表示)對於方案對 是「虛線」符號(c1.c2),其中c1是汽車 字段的值,並且c2是cdr字段的值。例如(4.5)是一個 對,其汽車爲4,其cdr爲5.注意(4.5)是 的一對外部表示,而不是將 評估爲一對的表達式。

.不是符號。

+0

使用R5RS ..可能相同.. – user1915570

1

儘管.可以是符號的一部分,但.本身並不是有效的符號。 .在列表結構中用作carcdr之間的分隔符。例如。 (a . (b . (c .()))) ; ==> (a b c)

實際應用程序是作爲程序原型中的休息參數的歷史用法,您可以將它用作模板的宏轉換。此外,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 4) 2 5),因爲它不希望顯示該點。如果它更願意顯示點,則它會將其顯示爲((1 . (4 .())) . ((2 . (5 .())))),因爲那是該數據結構中有多少對。

如果您設法獲得輸出((1 4) (2 5))並且確實想要((1 . 4) (2 . 5))您需要將list替換爲cons

+0

是的,我做了..但後來我得到最後的空白列表..我想我完全不明白。我會用我的整個代碼提出新的問題 - 我儘量避免這種情況..但我認爲我需要展示我做了什麼... – user1915570

+0

@ user1915570您已經用'list'切換外部'cons'。當迭代一個列表時,你需要使用cons來加入,因爲尾遞歸創建一個列表和'(cons'first'(結果的其餘部分))'成爲'(首先是結果的其餘部分)'而每個部分'list'變成'(第一個((((((result()))))))''的其餘部分。由於'(list a b)'是'(cons a(cons b'()))'。儘量不要使用'list'一段時間,至少對於小列表來說,它是一個懸念。因此而不是'(list(list a)b c)'do'(cons(cons a'())(cons b(cons c'())))' – Sylwester