Di clojure, bagaimana cara menerapkan 'dan' ke daftar?

Sebagai penutup, bagaimana kita bisa menerapkan and atau makro lainnya ke daftar?

Ini tidak berhasil:

(apply and '(true false))

Karena apply tidak dapat mengambil nilai makro.

Jadi, apa cara terbaik untuk memeriksa apakah semua elemen daftar sudah benar?


person viebel    schedule 09.02.2012    source sumber
comment
kemungkinan duplikat kurangi atau terapkan menggunakan fungsi logika di Clojure   -  person amalloy    schedule 10.02.2012


Jawaban (4)


Anda dapat melakukan ini sebagai gantinya:

(every? identity '(true false))

Lihat utas ini untuk informasi lebih lanjut.

person Kai Sternad    schedule 09.02.2012
comment
Adakah yang lebih rapi untuk kasus penggunaan ini di versi terbaru? - person matanster; 01.07.2018

Di Clojure makro bukanlah hal kelas satu mereka tidak membuat fungsi yang mirip, dan Anda tidak dapat meneruskannya ke fungsi lain, dan Anda tidak dapat apply fungsi tersebut. Ini karena mereka sudah selesai dan selesai sebelum penerapan apa pun dilakukan.

Merupakan kebiasaan untuk menggabungkan makro dalam fungsi ke apply atau meneruskannya ke fungsi

(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])

makro pembaca fungsi anonim #( membuat ini begitu mudah sehingga makro yang bukan kelas satu bukanlah suatu ketidaknyamanan. Coba saja mengingat aturan pertama klub makro

person Arthur Ulfeldt    schedule 09.02.2012
comment
Namun pendekatan ini akan gagal ketika makro menerima sejumlah argumen yang bervariasi. - person viebel; 10.02.2012
comment
kamu melanggar aturan pertama klub makro... ya, bahkan abstraksi makro pun bocor :( - person Arthur Ulfeldt; 10.02.2012

Anda juga dapat melakukan ini: (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

Saya mengutip sintaksis dan kemudian menerapkan palu besar untuk menghilangkan tanda kurung di sekitar koleksi dan karena saya mengutipnya, harus menggunakan eval. Ini berguna jika Anda membuat makro dan fungsi yang diteruskan adalah 'dan'.

jadi (list 1 2 3) kereta luncur yang dipalu menjadi 1 2 3.

Ini adalah salah satu cara, sangat buruk, tetapi berhasil, jadi saya menerapkannya dan itu bagus. Jadi clojure saya tidak bagus tapi saya harap contoh makro ini menjelaskan semuanya.

(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)))

Penggunaan (Tidak Pernah):

(split-my-args-then-apply-fn 
    and 
    {:something :true :something-else false} 
    :something :something-else)
person Dhruv    schedule 23.09.2014