ในการปิดบังจะใช้ 'และ' กับรายการได้อย่างไร

สรุปแล้ว เราจะใช้ and หรือมาโครอื่นกับรายการได้อย่างไร

สิ่งนี้ใช้ไม่ได้:

(apply and '(true false))

เนื่องจาก apply ไม่สามารถรับค่าของมาโครได้

ดังนั้นวิธีที่ดีที่สุดในการตรวจสอบว่าองค์ประกอบทั้งหมดของรายการเป็นจริงคืออะไร?


person viebel    schedule 09.02.2012    source แหล่งที่มา
comment
เป็นไปได้ที่ซ้ำกันของ ลดหรือนำไปใช้โดยใช้ฟังก์ชันลอจิคัลใน Clojure   -  person amalloy    schedule 10.02.2012


คำตอบ (4)


คุณสามารถทำได้แทน:

(every? identity '(true false))

ดูกระทู้นี้สำหรับข้อมูลเพิ่มเติม

person Kai Sternad    schedule 09.02.2012
comment
มีอะไรที่เรียบร้อยกว่าสำหรับกรณีการใช้งานนี้ในเวอร์ชันล่าสุดหรือไม่ - person matanster; 01.07.2018

ใน 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

person Arthur Ulfeldt    schedule 09.02.2012
comment
แต่วิธีการนี้จะพังเมื่อแมโครได้รับอาร์กิวเมนต์จำนวนตัวแปร - person viebel; 10.02.2012
comment
คุณกำลังฝ่าฝืนกฎข้อแรกของ Macro Club ... ใช่แล้ว แม้แต่ Macro Abstraction ก็รั่วไหล :( - person Arthur Ulfeldt; 10.02.2012

คุณยังสามารถทำสิ่งนี้ได้: (apply = true '(true false))

person Fei Meng    schedule 21.09.2014

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)
person Dhruv    schedule 23.09.2014