diff options
author | EuAndreh <eu@euandre.org> | 2021-08-14 13:52:23 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2021-08-14 14:03:54 -0300 |
commit | 495636b0994a89f807ba2ad7f3bf2faf0196eca6 (patch) | |
tree | 66c8fef8341a237da76e8345c861dfb548e6c46e /_tils/2021-04-24-three-way-conditional-for-number-signs.md | |
parent | _tils/2021-08-11-encoding-and-decoding-javascript-bigint-values-with-reviver.... (diff) | |
download | euandre.org-495636b0994a89f807ba2ad7f3bf2faf0196eca6.tar.gz euandre.org-495636b0994a89f807ba2ad7f3bf2faf0196eca6.tar.xz |
mv _tils/2021-04-24-three-way-conditional-for-number-signs{ => -on-lisp}.md
Diffstat (limited to '_tils/2021-04-24-three-way-conditional-for-number-signs.md')
-rw-r--r-- | _tils/2021-04-24-three-way-conditional-for-number-signs.md | 61 |
1 files changed, 0 insertions, 61 deletions
diff --git a/_tils/2021-04-24-three-way-conditional-for-number-signs.md b/_tils/2021-04-24-three-way-conditional-for-number-signs.md deleted file mode 100644 index ec62378..0000000 --- a/_tils/2021-04-24-three-way-conditional-for-number-signs.md +++ /dev/null @@ -1,61 +0,0 @@ ---- - -title: Three-way conditional for number signs - -date: 2021-04-24 3 - -layout: post - -lang: en - -ref: three-way-conditional-for-number-signs - ---- - -A useful macro from Paul Graham's [On Lisp][on-lisp] book: - -```lisp -(defmacro nif (expr pos zero neg) - (let ((g (gensym))) - `(let ((,g ,expr)) - (cond ((plusp ,g) ,pos) - ((zerop ,g) ,zero) - (t ,neg))))) -``` - -After I looked at this macro, I started seeing opportunities to using it in many places, and yet I didn't see anyone else using it. - -The latest example I can think of is section 1.3.3 of [Structure and Interpretation of Computer Programs][sicp], which I was reading recently: - -```scheme -(define (search f neg-point pos-point) - (let ((midpoint (average neg-point pos-point))) - (if (close-enough? neg-point post-point) - midpoint - (let ((test-value (f midpoint))) - (cond ((positive? test-value) - (search f neg-point midpoint)) - ((negative? test-value) - (search f midpoint pos-point)) - (else midpoint)))))) -``` - -Not that the book should introduce such macro this early, but I couldn't avoid feeling bothered by not using the `nif` macro, which could even remove the need for the intermediate `test-value` variable: - -```scheme -(define (search f neg-point pos-point) - (let ((midpoint (average neg-point pos-point))) - (if (close-enough? neg-point post-point) - midpoint - (nif (f midpoint) - (search f neg-point midpoint) - (midpoint) - (search f midpoint pos-point))))) -``` - -It also avoids `cond`'s extra clunky parentheses for grouping, which is unnecessary but built-in. - -As a macro, I personally feel it tilts the balance towards expressivenes despite its extra cognitive load toll. - -[on-lisp]: http://www.paulgraham.com/onlisptext.html -[sicp]: https://mitpress.mit.edu/sites/default/files/sicp/index.html |