ฉันพบว่าแพคเกจต่าง ๆ ในคำแนะนำการติดตั้งใช้ push หรือ add-to-list (ตัวอย่างเช่นการเพิ่มไดเรกทอรีไปยัง load-path) และฉันก็สงสัยว่าอะไรคือความแตกต่างและกรณีการใช้งานของแต่ละคนจะเป็นอย่างไร
ฉันพบว่าแพคเกจต่าง ๆ ในคำแนะนำการติดตั้งใช้ push หรือ add-to-list (ตัวอย่างเช่นการเพิ่มไดเรกทอรีไปยัง load-path) และฉันก็สงสัยว่าอะไรคือความแตกต่างและกรณีการใช้งานของแต่ละคนจะเป็นอย่างไร
คำตอบ:
#zck ระบุว่าอะไรคือความแตกต่าง แต่ถ้าที่มีความแตกต่างเพียงแล้วคุณอาจจะถามเกี่ยวกับและcl-pushnew
add-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'.
add-to-list can't use lexical var ...; use push or cl-pushnew
(push (5 6) my-list)
ยังทำให้ฉันมีข้อผิดพลาด - 5
ไม่ใช่ฟังก์ชั่น สิ่งนี้แตกต่างจากadd-to-list
พฤติกรรมของอย่างไร
(5 6)
ไปยังสถานที่ (ค่าของตัวแปร) แล้วคุณจะต้องสร้างรายการmy-list
(5 6)
วิธีหนึ่งในการทำเช่นนั้นคือการใช้'(5 6)
; (list 5 6)
ก็คือการใช้ push
ประเมินข้อโต้แย้ง
push
เป็นสถานที่เช่นตัวแปร ARG แรกนั้นถูกประเมินประเมินค่า consed ให้กับค่าของตัวแปรนั้นและตัวแปรนั้นถูกตั้งค่าเป็นข้อเสียใหม่นั้น add-to-list
ประเมินหาเรื่องแรกของมันในการผลิตตัวแปรที่มีการปรับปรุงค่า push
ไม่ประเมิน ARG ที่สองซึ่งเป็นตัวแปรที่จะอัปเดต คำสั่งหาเรื่องจะกลับรายการระหว่างทั้งสอง
ความแตกต่างอื่น:
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")
จากเอกสารของ EmacsหรือC-h f push
:
มาโคร: รายชื่อองค์ประกอบการผลักดัน
แมโครนี้สร้างรายการใหม่ซึ่งรถยนต์เป็นองค์ประกอบและ cdr คือรายการที่ระบุโดย listname และบันทึกรายการนั้นใน listname
จากหน้าเดียวกันหรือC-h f add-to-list
:
ฟังก์ชั่น: องค์ประกอบสัญลักษณ์เพิ่มในรายการ & ตัวเลือกผนวกเปรียบเทียบ -n
ฟังก์ชันนี้ตั้งค่าสัญลักษณ์ตัวแปรโดยการรวมองค์ประกอบเข้ากับค่าเก่าหากองค์ประกอบนั้นยังไม่ได้เป็นสมาชิกของค่านั้น
ดังนั้นadd-to-list
ดันถ้าองค์ประกอบไม่ได้มี
cl-pushnew
add-to-list
พฤติกรรมเช่น
add-to-list
เป็นรหัสโดยใช้cl-pushnew
และฉันพบว่าบล็อกโพสต์นี้น่าสนใจมาก: yoo2080.wordpress.com/2013/09/11/…