|
449 | 449 | [expr & clauses] |
450 | 450 | (core/assert (even? (count clauses))) |
451 | 451 | (core/let [g (gensym) |
452 | | - pstep (core/fn [[test step]] `(if ~test (-> ~g ~step) ~g))] |
| 452 | + steps (map (core/fn [[test step]] `(if ~test (-> ~g ~step) ~g)) |
| 453 | + (partition 2 clauses))] |
453 | 454 | `(let [~g ~expr |
454 | | - ~@(interleave (repeat g) (map pstep (partition 2 clauses)))] |
455 | | - ~g)))) |
| 455 | + ~@(interleave (repeat g) (butlast steps))] |
| 456 | + ~(if (empty? steps) |
| 457 | + g |
| 458 | + (last steps)))))) |
456 | 459 |
|
457 | 460 | #?(:cljs |
458 | 461 | (core/defmacro cond->> |
|
463 | 466 | [expr & clauses] |
464 | 467 | (core/assert (even? (count clauses))) |
465 | 468 | (core/let [g (gensym) |
466 | | - pstep (core/fn [[test step]] `(if ~test (->> ~g ~step) ~g))] |
| 469 | + steps (map (core/fn [[test step]] `(if ~test (->> ~g ~step) ~g)) |
| 470 | + (partition 2 clauses))] |
467 | 471 | `(let [~g ~expr |
468 | | - ~@(interleave (repeat g) (map pstep (partition 2 clauses)))] |
469 | | - ~g)))) |
| 472 | + ~@(interleave (repeat g) (butlast steps))] |
| 473 | + ~(if (empty? steps) |
| 474 | + g |
| 475 | + (last steps)))))) |
470 | 476 |
|
471 | 477 | #?(:cljs |
472 | 478 | (core/defmacro as-> |
|
475 | 481 | successive form, returning the result of the last form." |
476 | 482 | [expr name & forms] |
477 | 483 | `(let [~name ~expr |
478 | | - ~@(interleave (repeat name) forms)] |
479 | | - ~name))) |
| 484 | + ~@(interleave (repeat name) (butlast forms))] |
| 485 | + ~(if (empty? forms) |
| 486 | + name |
| 487 | + (last forms))))) |
480 | 488 |
|
481 | 489 | #?(:cljs |
482 | 490 | (core/defmacro some-> |
483 | 491 | "When expr is not nil, threads it into the first form (via ->), |
484 | 492 | and when that result is not nil, through the next etc" |
485 | 493 | [expr & forms] |
486 | 494 | (core/let [g (gensym) |
487 | | - pstep (core/fn [step] `(if (nil? ~g) nil (-> ~g ~step)))] |
| 495 | + steps (map (core/fn [step] `(if (nil? ~g) nil (-> ~g ~step))) |
| 496 | + forms)] |
488 | 497 | `(let [~g ~expr |
489 | | - ~@(interleave (repeat g) (map pstep forms))] |
490 | | - ~g)))) |
| 498 | + ~@(interleave (repeat g) (butlast steps))] |
| 499 | + ~(if (empty? steps) |
| 500 | + g |
| 501 | + (last steps)))))) |
491 | 502 |
|
492 | 503 | #?(:cljs |
493 | 504 | (core/defmacro some->> |
494 | 505 | "When expr is not nil, threads it into the first form (via ->>), |
495 | 506 | and when that result is not nil, through the next etc" |
496 | 507 | [expr & forms] |
497 | 508 | (core/let [g (gensym) |
498 | | - pstep (core/fn [step] `(if (nil? ~g) nil (->> ~g ~step)))] |
| 509 | + steps (map (core/fn [step] `(if (nil? ~g) nil (->> ~g ~step))) |
| 510 | + forms)] |
499 | 511 | `(let [~g ~expr |
500 | | - ~@(interleave (repeat g) (map pstep forms))] |
501 | | - ~g)))) |
| 512 | + ~@(interleave (repeat g) (butlast steps))] |
| 513 | + ~(if (empty? steps) |
| 514 | + g |
| 515 | + (last steps)))))) |
502 | 516 |
|
503 | 517 | #?(:cljs |
504 | 518 | (core/defmacro if-some |
|
0 commit comments