|
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