diff options
Diffstat (limited to 'src/content/tils/2021/04/24/scm-nif.adoc')
-rw-r--r-- | src/content/tils/2021/04/24/scm-nif.adoc | 61 |
1 files changed, 0 insertions, 61 deletions
diff --git a/src/content/tils/2021/04/24/scm-nif.adoc b/src/content/tils/2021/04/24/scm-nif.adoc deleted file mode 100644 index 2ea8a6f..0000000 --- a/src/content/tils/2021/04/24/scm-nif.adoc +++ /dev/null @@ -1,61 +0,0 @@ -= Three-way conditional for number signs on Lisp -:categories: lisp scheme common-lisp -:sort: 2 -:updatedat: 2021-08-14 - -:on-lisp: https://www.paulgraham.com/onlisptext.html -:sicp: https://mitpress.mit.edu/sites/default/files/sicp/index.html - -A useful macro from Paul Graham's {on-lisp}[On Lisp] book: - -[source,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 {sicp}[Structure and -Interpretation of Computer Programs], which I was reading recently: - -[source,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: - -[source,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. |