Recentemente ho preso una deviazione in Clojure da F # e mi sono imbattuto in una macro chiamata cond. Ecco un esempio sull'uso:clojure like cond in F #
(cond
(= target (nth arr mid)) mid
(< target (nth arr mid)) (search left (- mid 1))
(> target (nth arr mid)) (search (+ mid 1) right)
(= left right) -1)
Questo significa quanto segue in pseudo codice:
if target == arr.[mid] then return mid
if target < arr.[mid] then return (call search(left, mid-1))
if target > arr.[mid] then return (call search(mid+1, right))
if left == right then return -1
Questo è solo un esempio di una ricerca binaria nel caso in cui vi sono state chiedendo che cosa è di destra e sinistra metà, ma non molto importante.
Ho cercato di trovare qualcosa di simile in F # ma non ho potuto, quindi ho deciso di provare a scriverlo da solo. Ho finito con qualcosa di simile:
type condition = bool * int
let cond (conds: condition seq) =
conds |> Seq.pick(fun c -> if fst c then Some (snd c) else None)
cond [| ((=) target arr.[mid], mid)
((=) left right, -1)
((<) target arr.[mid], recSrch left (mid-1))
((>) target arr.[mid], recSrch (mid+1) right)
|]
Il problema qui è che voglio usarlo in una funzione ricorsiva, e perché recSrch sinistra (mid-1) sono in corso di valutazione da subito in modo da finire in un ciclo infinito. Voglio che venga valutato solo quando la condizione è valida. Inoltre, il modulo non è ancora pulito come in Clojure.
Qualche idea come potrei migliorare?
Per quelli di noi che non conoscono Clojure tua domanda è estremamente opaco. – ildjarn
Ci scusiamo per questo, ho aggiunto qualche pseudo codice per chiarire come si comporta il codice clojure. –
Puoi pubblicare il codice completo, tra cui '' target'', '' left'', 'right''. – Gustavo