# msgid "" msgstr "" msgid "title: Three-way conditional for number signs" msgstr "" msgid "date: 2021-04-24 3" msgstr "" msgid "layout: post" msgstr "" msgid "lang: en" msgstr "" msgid "ref: three-way-conditional-for-number-signs" msgstr "" msgid "" "A useful macro from Paul Graham's [On " "Lisp](http://www.paulgraham.com/onlisptext.html) book:" msgstr "" msgid "" "(defmacro nif (expr pos zero neg)\n" " (let ((g (gensym)))\n" " `(let ((,g ,expr))\n" " (cond ((plusp ,g) ,pos)\n" " ((zerop ,g) ,zero)\n" " (t ,neg)))))\n" msgstr "" msgid "" "After I looked at this macro, I started seeing opportunities to using it in " "many places, and yet I didn't see anyonelse using it." msgstr "" msgid "" "The latest example I can think of is section 1.3.3 of [Structure and " "Interpretation of Computer " "Programs](https://mitpress.mit.edu/sites/default/files/sicp/index.html), " "which I was reading recently:" msgstr "" msgid "" "(define (search f neg-point pos-point)\n" " (let ((midpoint (average neg-point pos-point)))\n" " (if (close-enough? neg-point post-point)\n" " midpoint\n" " (let ((test-value (f midpoint)))\n" " (cond ((positive? test-value)\n" " (search f neg-point midpoint))\n" " ((negative? test-value)\n" " (search f midpoint pos-point))\n" " (else midpoint))))))\n" msgstr "" msgid "" "Not that the book should introduce such macro this early, but I couldn't " "avoid feeling bothered by not using a `nif` macro, which could even remove " "the need for the intermediate `test-value` variable:" msgstr "" msgid "" "(define (search f neg-point pos-point)\n" " (let ((midpoint (average neg-point pos-point)))\n" " (if (close-enough? neg-point post-point)\n" " midpoint\n" " (nif (f midpoint)\n" " (search f neg-point midpoint)\n" " (midpoint)\n" " (search f midpoint pos-point)))))\n" msgstr "" msgid "" "It also avoids `cond`'s extra clunky parentheses for grouping, which is " "unnecessary but built-in." msgstr "" msgid "" "As a macro, I personally feel it tilts the balance towards expressivenes " "despite its extra cognitive load toll." msgstr ""