私はあなたが「それから」でop-result
を使用したい推測していますしかし、多くの述語関数彼らの議論ではないtrue
を返します。だから、単純にこれを書き込むことはできません。
(if-let [op-result (pred (op))]
op-result ;maybe `true`, but you want `(op)`
false)
したいコア式は次のとおりです。
(and (pred x) x)
あなたは
(if-let [op-result (and (pred (op)) (op))]
op-result
false)
を書くことができしかし(op)
が高価である場合、これは良いです。
(if-let [op-result (let [x (op)] (and (pred x) x))]
op-result
false)
もちろん、ちょっと退屈なので、それがたくさん必要な場合は、マクロを書く価値があるかもしれません。
私は別のアプローチは、述語は "truthy" にすることですとします
(defn truthy
"Given a predicate function, return a new function.
When the original predicate function returns true for some value,
the new function returns the value (instead of true). Else returns
false."
[pred]
(fn [v]
(and (pred v) v)))
((truthy even?) 2) ; 2
((truthy even?) 3) ; false
(if-let [op-result ((truthy pred) (op))]
op-result ;use op-result
false)
再度、マクロが便利かもしれません。
いくつかのLispでIは、(Emacs Lispのラケットでmatch
、pcase
)パターンマッチングを使用したいです。これらは、cond
のような形式です。多くの場合、テストの述語を適用し、元の値をバインドすることができます。私はcore.match
がこれを行うことができるかどうか、またはあなたがこれを行うためだけにそれを含める場合は分かりません。
最後に、私は完全に誰かがこのようなものは、すでに私は知らないのClojureでワンライナーとして存在することを指摘して期待しています。 :)しかし、私は誰もまだ持っていないので、私は答えを試みると思った。
"my-var"に対して 'op-result'を省略することができるので、単純な'(if(pred op-result)then else) 'だけです。あるいはあなたの例はもっと複雑ですか? – ClojureMostly