<div dir="ltr"><div class="markdown-here-wrapper" style><p style="margin:1.2em 0px!important">Making it the default behavior would require it to be a macro instead of an ordinary function, so you’d lose the ability to pass it around as a function. Given that implementing a short circuit macro on top of <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline;background-color:rgb(248,248,248)">hash-ref!</code> is as simple as <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;display:inline;background-color:rgb(248,248,248)">(define-syntax-rule (hash-ref!! table key expr) (hash-ref! table key (thunk expr)))</code>, whoever made the decision probably figured that the loss of the ability to use it as a first-class function wasn’t worth making a one-line macro default behavior.</p>
<div title="MDH:TWFraW5nIGl0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIHdvdWxkIHJlcXVpcmUgaXQgdG8gYmUgYSBt
YWNybyBpbnN0ZWFkIG9mIGFuIG9yZGluYXJ5IGZ1bmN0aW9uLCBzbyB5b3UnZCBsb3NlIHRoZSBh
YmlsaXR5IHRvIHBhc3MgaXQgYXJvdW5kIGFzIGEgZnVuY3Rpb24uIEdpdmVuIHRoYXQgaW1wbGVt
ZW50aW5nIGEgc2hvcnQgY2lyY3VpdCBtYWNybyBvbiB0b3Agb2YgYGhhc2gtcmVmIWAgaXMgYXMg
c2ltcGxlIGFzIGAoZGVmaW5lLXN5bnRheC1ydWxlIChoYXNoLXJlZiEhIHRhYmxlIGtleSBleHBy
KSAoaGFzaC1yZWYhIHRhYmxlIGtleSAodGh1bmsgZXhwcikpKWAsIHdob2V2ZXIgbWFkZSB0aGUg
ZGVjaXNpb24gcHJvYmFibHkgZmlndXJlZCB0aGF0IHRoZSBsb3NzIG9mIHRoZSBhYmlsaXR5IHRv
IHVzZSBpdCBhcyBhIGZpcnN0LWNsYXNzIGZ1bmN0aW9uIHdhc24ndCB3b3J0aCBtYWtpbmcgYSBv
bmUtbGluZSBtYWNybyBkZWZhdWx0IGJlaGF2aW9yLg==" style="height:0;font-size:0em;padding:0;margin:0">​</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Nov 7, 2014 at 1:08 PM, Matthew Butterick <span dir="ltr"><<a href="mailto:mb@mbtype.com" target="_blank">mb@mbtype.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Since `hash-ref!` includes `or`-like functionality, is there a reason it's not implemented with short-circuit logic similar to `or`?<br>
<br>
In other words, the function `hash-ref!` is invoked thus:<br>
<br>
(hash-ref! hashtable key new-value-if-needed)<br>
<br>
What I notice is that if you put an expression in the new-value position, like so:<br>
<br>
(hash-ref! hashtable key (expression-that-produces-value))<br>
<br>
Then this expression will always be evaluated before the function is called.<br>
<br>
But this seems wasteful, since if 'key' exists in 'hashtable', the expression won't be needed.<br>
<br>
`hash-ref!` will also take a thunk, so you can manually delay evaluation of the value expression by wrapping it in λ:<br>
<br>
(hash-ref! hashtable key (λ () (expression-that-produces-value)))<br>
<br>
But I'm curious why delayed evaluation isn't the default behavior.<br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</blockquote></div><br></div>