2017-02-15 9 views
2

私は多くの述語関数をベクトルfsに持っていて、それらをまとめてandとしたいと思います。このは、最初の2つの機能のためにの作品:私は何の問題がいくつあるか、すべての機能にandを適用していないコードを書きたいしかし多くの述語関数をすべて適用する方法( `と`それら)

((and (first fs) (second fs)) value) 

andはマクロなので(apply and fs)はコンパイルされません。 andで作業述語関数の例えば

、これを試してみてください。

((and number? integer?) 1) 

編集場合は、あなたがコメントを読んでいない、両方andの構成は、上記BAD例です。同じ構成が実際に働くには、andではなくevery-predを使用してください。

+0

'do'ブロックに入れてみましたか? – jmargolisvt

+0

いいえ - それをどうやって行うのか、なぜそうしたいのですか - 副作用はありません –

+0

私は自分の答えを編集しました。私はかなりevery-predがあなたが望むものを正確に行うことを確信しています。 – RedDeckWins

答えて

3

述語を使用しているため、every-predが対象です。

あなたの編集を読んだ後 - ありがとう、私は知らなかったし、andでそれを行うことができます。さらに、私は私の答えを編集した、と私はあなたが間違いなくevery-predは(私は前にそれに気づいていなかった!)この質問に良い答えているように見えます

((apply every-pred [number? integer?]) 1) 
=> true 
((apply every-pred [number? integer?]) "asdf") 
=> false 
+0

私はそれを修正しました、ごめんなさい。 – RedDeckWins

+0

明確にするために、必要な関数は '(部分的にevery-predに適用されます)'です。 – Thumbnail

1

をすべての-predを適用したいと思います。 A related function that may be handyjuxtです。これは、単一の引数に多くの機能が適用されます。every-predとは異なり、juxt機能がない短絡を行い、常にリストの各機能を評価し、

((juxt a b c) x) => [(a x) (b x) (c x)] 

注意。例:

(ns tst.clj.core 
    (:use clj.core clojure.test tupelo.test) 
    (:require [tupelo.core :as t])) 

(defn f2 [x] (zero? (mod x 2))) 
(defn f3 [x] (zero? (mod x 3))) 
(defn f5 [x] (zero? (mod x 5))) 

(def f235 (apply juxt [f2 f3 f5])) 

これは私たちに結果を与える:

truthy?機能が booleanに似て
(f235 2) => [true false false] 
(f235 3) => [false true false] 
(f235 5) => [false false true] 
(f235 6) => [true true false] 
(f235 10) => [true false true] 
(f235 15) => [false true true] 
(f235 30) => [true true true] 

(every? truthy? (f235 15)) => false 
(every? truthy? (f235 30)) => true 

(defn truthy? 
    "Returns true if arg is logical true (neither nil nor false); otherwise returns false." 
    [arg] 
    (if arg true false)) 

P.S.オリジナルの例では(and (f1 x) (f2 x))は表示されず、代わりに(and f1 f2) => f1と記載されています。だからあなたがタイプするとき

(def fs [f1 f2 f3 f4]) 
((and (first fs) (second fs)) value) 

=> ((and f1 f2) value) 
=> (f1 value) 

これはあなたが求めていた結果を与えません。

関連する問題