Hi,
I am a bit confused why the following code doesn't produce an output:
(match #f
[else
(cond
[#f 'not-evaluated]
[else 'also-not-evaluated])])
I would expect it to output 'also-not-evaluated
Thanks
Hi,
I am a bit confused why the following code doesn't produce an output:
(match #f
[else
(cond
[#f 'not-evaluated]
[else 'also-not-evaluated])])
I would expect it to output 'also-not-evaluated
Thanks
The else in match is treated as a variable, which match binds. What you wrote is equivalent to this:
(match #f
[foo
(cond
[#f 'not-evaluated]
[foo 'also-not-evaluated])])
And since foo is bound to #f, none of the cond branches are taken and the whole cond form evaluated to (void).
I recommend using _ instead of else when you want to express a catch-all fallback branch with match. The _ form is treated specially by match and interpreted as "match anything, bind nothing". Like this:
(match #f
[_
(cond
[#f 'not-evaluated]
[else 'this-is-evaluated-now])])
One « précision » to add: cond recognizes else by binding; if it isn’t bound to the same thing as what it knows from racket/base, it won’t treat it as an else (or conversely if you give it something else that is bound to that, cond does see the else).
and if i remember well of Lisp , the ancestor of Scheme, in Lisp there is no else ,we simply replace it by T or t, meaning True when there is a need of an else endind the cond. It is then a bit rustic but more simple to understand:
;; la recherche de l'element a un niveau arbitraire
(defun member1 (ele liste)
(cond
((atom liste) NIL)
((equal (car liste) ele) liste)
(T (memb1 ele (member1 ele (car liste)) (cdr liste)))))