ฉันไม่พบฟังก์ชันไลบรารี Elisp มาตรฐานเพื่อรวมสองรายการคุณสมบัติเช่นนี้:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
ฉันสามารถสร้างบางอย่างด้วยdolist
แต่ก่อนที่ฉันจะทำฉันต้องการตรวจสอบว่าฉันไม่ได้มองเห็นฟังก์ชั่นที่มีอยู่ในห้องสมุดบางแห่ง
อัพเดทตามความคิดเห็น :
- ในการตอบสนองต่อความคิดเห็น "หลายวิธี":
ฉันคิดว่าไม่มีฟังก์ชั่นดังกล่าวเพราะมีคำตอบที่แตกต่างกัน (และอาจเป็นไปได้) สำหรับคำถาม: จะทำอย่างไรเมื่อคุณมีชื่อคุณสมบัติที่ซ้ำกันด้วยค่าที่แตกต่างกัน?
ใช่มีคำถามเกี่ยวกับวิธีการรวมรายการที่ซ้ำกัน แต่มีวิธีการค่อนข้างน้อยในการจัดการ ฉันเห็นสองแนวทางทั่วไป ขั้นแรกคำสั่งอาร์กิวเมนต์สามารถแก้ไขรายการที่ซ้ำได้ เช่นขวาสุดชนะในขณะที่การผสาน Clojure ของ ประการที่สองการผสานอาจมอบหมายให้ผู้ใช้ที่ให้ฟังก์ชั่นการโทรกลับในขณะที่การผสานทับทิม
ไม่ว่าในกรณีใดความจริงที่ว่ามีวิธีการทำที่แตกต่างกันก็ไม่ได้ป้องกันไม่ให้ห้องสมุดมาตรฐานภาษาอื่น ๆ อีกมากมายไม่สามารถจัดเตรียมฟังก์ชันการผสานได้ อาร์กิวเมนต์ทั่วไปเดียวกันสามารถพูดได้ของการเรียงลำดับและยัง Elisp ให้ฟังก์ชั่นการเรียงลำดับ
- "คุณอธิบายได้ไหม?" / "โปรดระบุพฤติกรรมที่คุณต้องการอย่างแม่นยำ"
โดยทั่วไปแล้วฉันเปิดรับสิ่งที่ชุมชน Elisp ใช้ หากคุณต้องการตัวอย่างที่เฉพาะเจาะจงนี่คือตัวอย่างหนึ่งที่สามารถใช้งานได้:
(a-merge-function '(k1 1) '(k2 2 k3 3) '(k3 0))
และผลตอบแทน
'(k1 1 k2 2 k3 0))
นี่จะเป็นสไตล์ที่ถูกต้องที่สุดเช่นเดียวกับการผสานของ Clojure
- "พวกเขาอยู่ในรายการดังนั้นเพียงต่อท้าย"
ไม่มีappend
ไม่ได้รักษารายการคุณสมบัติความหมาย นี้:
(append '(k1 1 k2 2) '(k2 0))
คืนค่านี้:
(k1 1 k2 2 k2 0)
ผนวกเป็นฟังก์ชั่นในตัวใน `ซอร์สโค้ด C '
(ผนวกและพักผ่อน SEQUENCES)
เชื่อมอาร์กิวเมนต์ทั้งหมดและสร้างผลลัพธ์เป็นรายการ ผลที่ได้คือรายการที่มีองค์ประกอบเป็นองค์ประกอบของการขัดแย้งทั้งหมด แต่ละอาร์กิวเมนต์อาจเป็นรายการเวกเตอร์หรือสตริง อาร์กิวเมนต์สุดท้ายไม่ถูกคัดลอกใช้เป็นส่วนท้ายของรายการใหม่
- "และตัวอย่างของคุณไม่แสดงอะไรเลยเหมือนกับการผสาน - มันไม่แสดงรายการคุณสมบัติสองรายการ"
ใช่; มันรวมขั้นตอน มันแสดงให้เห็นว่าการผสานโดยใช้ฟังก์ชั่นรายการคุณสมบัติของเอกสารของ Elisp นั้นเป็นเรื่องที่เจ็บปวด:
(setq pl nil)
(setq pl (plist-put pl 'key-1 'value-1))
(setq pl (plist-put pl 'key-2 'value-2))
เพียงแสดงค่าผลลัพธ์ที่ได้จากpl
:
(key-1 value-1 key-2 value-2)
เพื่อย้ำอีกครั้งฉันสามารถเขียนฟังก์ชั่นเพื่อแก้ปัญหานี้ได้ แต่ก่อนอื่นฉันต้องการทราบว่าฟังก์ชั่นดังกล่าวมีอยู่ที่ใดที่หนึ่งที่ใช้กันทั่วไป
ในที่สุดถ้าคุณลงคะแนนคำถามเพราะคุณพบว่ามันไม่ชัดเจนฉันจะขอให้คุณพิจารณาใหม่ในขณะนี้ว่าฉันได้พยายามที่จะชี้แจง นี่ไม่ใช่การขาดการวิจัย เอกสาร Elisp ใน "รายการ" ไม่ตอบคำถาม
append
: (let ((args '((:a 1 :b 1) (:b 2) (:a 3)))) (apply #'append (reverse args))) => (:a 3 :b 2 :a 1 :b 1)
ซึ่งเหมือนกัน(:a 3 :b 2 :a 1)
ตราบใดที่คุณใช้ฟังก์ชั่น Plist เพื่อเข้าถึง Plist
plist-get
มิได้plist-member
ดูเหมือนจะดูแลถ้ามีคีย์ที่เหมือนกันหลาย ดูเหมือนว่าพวกเขามีพฤติกรรมคล้ายคลึงกับ alists ในแง่นี้: (plist-get '(:a "a" :b "b" :a "c") :a) ==> "a"
. ในขณะเดียวกัน(plist-put '(:a "a" :b "b" :a "c") :a "d")
แทนที่ค่าของ:a
คีย์แรกแต่ไม่ใช่ที่สอง
append
?