ความแตกต่างระหว่างการพุชและการเพิ่มในรายการคืออะไร


26

ฉันพบว่าแพคเกจต่าง ๆ ในคำแนะนำการติดตั้งใช้ push หรือ add-to-list (ตัวอย่างเช่นการเพิ่มไดเรกทอรีไปยัง load-path) และฉันก็สงสัยว่าอะไรคือความแตกต่างและกรณีการใช้งานของแต่ละคนจะเป็นอย่างไร


1
ฉันพยายามแปลงรหัสที่ใช้add-to-listเป็นรหัสโดยใช้cl-pushnewและฉันพบว่าบล็อกโพสต์นี้น่าสนใจมาก: yoo2080.wordpress.com/2013/09/11/…
dangom

คำตอบ:


21

#zck ระบุว่าอะไรคือความแตกต่าง แต่ถ้าที่มีความแตกต่างเพียงแล้วคุณอาจจะถามเกี่ยวกับและcl-pushnewadd-to-list

ความแตกต่างที่สำคัญอีกประการหนึ่งadd-to-listคือฟังก์ชั่นซึ่งหมายความว่ามันประเมินการขัดแย้งทั้งหมดโดยเฉพาะอย่างยิ่งสิ่งแรก pushเป็นแมโคร (ตามที่เป็นcl-pushnew) - มันไม่ได้ประเมินอาร์กิวเมนต์ที่สอง แต่จะตีความว่าเป็นสถานที่ทั่วไป

ตัวอย่างเช่นหากอาร์กิวเมนต์ที่สองเป็นสัญลักษณ์จะถือว่าเป็นตัวแปรและค่าของอาร์กิวเมนต์แรกจะถูกพิจารณาลงบนมูลค่าของสัญลักษณ์นั้นเป็นตัวแปรและตัวแปรนั้นถูกตั้งค่าเป็นข้อเสียใหม่นั้น

ตามที่เอกสารของสตริงadd-to-listบอกว่า:

This is handy to add some elements to configuration variables,
but please do not abuse it in Elisp code, where you are usually
better off using `push' or `cl-pushnew'.

6
นอกจากนี้ตาม byte-compiler:add-to-list can't use lexical var ...; use push or cl-pushnew
Malabarba

(push (5 6) my-list)ยังทำให้ฉันมีข้อผิดพลาด - 5ไม่ใช่ฟังก์ชั่น สิ่งนี้แตกต่างจากadd-to-listพฤติกรรมของอย่างไร
markasoftware

@markasoftware: คุณพยายามทำอะไร หากคุณต้องการที่จะผลักดันรายการ(5 6)ไปยังสถานที่ (ค่าของตัวแปร) แล้วคุณจะต้องสร้างรายการmy-list (5 6)วิธีหนึ่งในการทำเช่นนั้นคือการใช้'(5 6); (list 5 6)ก็คือการใช้ pushประเมินข้อโต้แย้ง
ดึง

@ ดึงคุณบอกว่ามันประเมินอาร์กิวเมนต์ แต่คำตอบของคุณระบุว่า "มันไม่ได้ประเมินอาร์กิวเมนต์แรก" ซึ่งเป็นที่มาของความสับสนของฉัน
markasoftware

@markasoftware: ฉันขอโทษ; ฉันพิมพ์ผิด - ฉันเขียนว่า "อาร์กิวเมนต์แรก" ที่ฉันควรจะเขียน "อาร์กิวเมนต์ที่สอง" ถูกต้องแล้ว - ขอบคุณ หาเรื่องที่สองเพื่อpushเป็นสถานที่เช่นตัวแปร ARG แรกนั้นถูกประเมินประเมินค่า consed ให้กับค่าของตัวแปรนั้นและตัวแปรนั้นถูกตั้งค่าเป็นข้อเสียใหม่นั้น add-to-listประเมินหาเรื่องแรกของมันในการผลิตตัวแปรที่มีการปรับปรุงค่า pushไม่ประเมิน ARG ที่สองซึ่งเป็นตัวแปรที่จะอัปเดต คำสั่งหาเรื่องจะกลับรายการระหว่างทั้งสอง
ดึง

15

ความแตกต่างอื่น:

pushเพิ่มองค์ประกอบที่จุดเริ่มต้นของรายการ

add-to-listช่วยให้คุณสามารถเพิ่มองค์ประกอบทั้งจุดเริ่มต้นหรือจุดสิ้นสุดของรายการ

(setq testasdf nil)

(push 'a testasdf)

testasdf
(a)

(add-to-list 'testasdf 'b)

testasdf
(b a)

;; add element to the end
(add-to-list 'testasdf "hello" t)

testasdf
(b a "hello")

14

จากเอกสารของ EmacsหรือC-h f push:

มาโคร: รายชื่อองค์ประกอบการผลักดัน

แมโครนี้สร้างรายการใหม่ซึ่งรถยนต์เป็นองค์ประกอบและ cdr คือรายการที่ระบุโดย listname และบันทึกรายการนั้นใน listname

จากหน้าเดียวกันหรือC-h f add-to-list:

ฟังก์ชั่น: องค์ประกอบสัญลักษณ์เพิ่มในรายการ & ตัวเลือกผนวกเปรียบเทียบ -n

ฟังก์ชันนี้ตั้งค่าสัญลักษณ์ตัวแปรโดยการรวมองค์ประกอบเข้ากับค่าเก่าหากองค์ประกอบนั้นยังไม่ได้เป็นสมาชิกของค่านั้น

ดังนั้นadd-to-listดันถ้าองค์ประกอบไม่ได้มี


cl-pushnewadd-to-listพฤติกรรมเช่น
sam boosalis
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.