สรุปแล้ว เราจะใช้ and
หรือมาโครอื่นกับรายการได้อย่างไร
สิ่งนี้ใช้ไม่ได้:
(apply and '(true false))
เนื่องจาก apply
ไม่สามารถรับค่าของมาโครได้
ดังนั้นวิธีที่ดีที่สุดในการตรวจสอบว่าองค์ประกอบทั้งหมดของรายการเป็นจริงคืออะไร?
สรุปแล้ว เราจะใช้ and
หรือมาโครอื่นกับรายการได้อย่างไร
สิ่งนี้ใช้ไม่ได้:
(apply and '(true false))
เนื่องจาก apply
ไม่สามารถรับค่าของมาโครได้
ดังนั้นวิธีที่ดีที่สุดในการตรวจสอบว่าองค์ประกอบทั้งหมดของรายการเป็นจริงคืออะไร?
คุณสามารถทำได้แทน:
(every? identity '(true false))
ดูกระทู้นี้สำหรับข้อมูลเพิ่มเติม
ใน Clojure มาโครไม่ใช่สิ่งชั้นหนึ่ง พวกมันไม่ได้ประกอบขึ้นเหมือนฟังก์ชัน และคุณไม่สามารถส่งต่อพวกมันไปยังฟังก์ชันอื่นได้ และคุณไม่สามารถ apply
พวกมันได้ นี่เป็นเพราะพวกเขาเสร็จสิ้นและเสร็จสิ้นก่อนที่จะมีการสมัครใด ๆ
เป็นเรื่องปกติที่จะ รวมมาโครในฟังก์ชันไปที่ apply
หรือส่งต่อไปยังฟังก์ชัน
(defmacro my-macro [x y z] ...)
(apply #(my-macro %1 %2 %3) [1 2 3])
(map #(my-macro) [1 2 3] [:a :b :c] [a b c])
มาโครตัวอ่านฟังก์ชันที่ไม่ระบุชื่อ #(
ทำให้สิ่งนี้ง่ายมาก โดยที่แมโครที่ไม่ได้เป็นเฟิร์สคลาสนั้นไม่ใช่เรื่องไม่สะดวกเลย เพียงพยายาม จดจำกฎข้อแรกของ Macro club
คุณยังสามารถทำสิ่งนี้ได้: (apply = true '(true false))
user=> (eval `(and ~@(list true false)))
false
user=> (eval `(and ~@ (list true true 1)))
1
ฉันกำลังอ้างอิงไวยากรณ์ จากนั้นใช้ค้อนขนาดใหญ่เพื่อลบวงเล็บรอบคอลเลกชัน และเนื่องจากฉันยกมา ฉันจึงต้องใช้ eval สิ่งนี้มีประโยชน์หากคุณกำลังสร้างมาโครและฟังก์ชันที่ส่งเข้ามาคือ 'และ'
ดังนั้น (list 1 2 3)
เลื่อนที่ถูกทุบจึงกลายเป็น 1 2 3
นี่เป็นวิธีหนึ่ง แย่มาก แต่ก็ได้ผล ดังนั้นฉันจึงทำอย่างนั้นซึ่งก็ดีสำหรับฉัน ดังนั้นการปิดบังของฉันไม่ดีนัก แต่ฉันหวังว่าตัวอย่างมาโครนี้จะทำให้สิ่งต่าง ๆ ชัดเจนขึ้น
(defmacro split-my-args-then-apply-fn
"This is one terrible macro designed to show the use of 'and'."
[fun coll & args]
`(~fun ~@((apply juxt args) coll)))
การใช้งาน (ไม่เคย):
(split-my-args-then-apply-fn
and
{:something :true :something-else false}
:something :something-else)