2009-10-15 80 views
2

嗨我想一個簡單的元素添加到一個口齒不清列表。Lisp的追加工作不正常

(append queue1 (pop stack1)) 

我想上面的代碼會將stack1的第一個元素附加到queue1。 queue1需要不是零?謝謝。

+0

你真的應該讀的入門書 – 2009-10-15 09:49:39

+0

追加到Lisp的名單到底是不是一個好主意 – 2009-10-15 09:50:41

+0

追加返回具有附加的參數列表列表 - (追加列表1列表2項目list3) - >帶列表list1和list2和list3的元素 – 2009-10-15 09:53:15

回答

4

附加返回連接列表(queue1,附加stack1的第一個元素)。它不會修改隊列1。

追加的破壞力相當於是nconc:本追加到列表「到位」。

+0

所以要附加到列表,我應該簡單地執行(nconc queue1'4)將數字4附加到列表queue1。另外如果nconc是零,它還會追加嗎?謝謝 – 2009-10-15 02:57:28

+0

是的,(nconc queue1'4)將回收隊列1。在習慣上,你仍然應該使用返回的值,而不是依靠副作用。對不起,我不確定如果你通過nil會發生什麼(儘管我認爲它不會在零字面上):旋轉你的Lisp實現並嘗試它我猜! – itowlson 2009-10-15 03:27:54

1

你沒有指定的Lisp你的意思,但在Common Lisp中至少包括:

  1. append連接列表,所以其所有的參數必須是列表,原子。如果你真的想追加一個元素到列表中,你必須做(append list1 (list element))。這不是一個好主意,因爲在大多數Lisp列表中都是單鏈接的,並且必須遍歷整個列表才能追加到最後。通常可以用CONS追加到前面,然後在完成時顛倒列表,但這顯然不適用於隊列。

  2. APPEND不會修改其參數。 NCONC是一個破壞性的功能。雖然我相信NCONC特別是specified做更多或更少的人會發生什麼,最具破壞性的功能被允許摧毀它們的參數,再利用他們的記憶,但沒有必要留下任何連貫的後面。 Common Lisp中

  3. 解釋被實現爲利弊細胞或零,這意味着它們的行爲具有與後者一些怪癖的鏈。如果您希望列表的行爲更像您期望的其他語言那麼使用列表抽象數據結構。更何況,如果你想要一個帶有常量追加的隊列到最後。 cl-containers系統中有許多必要的數據結構,FSet中有功能數據結構。