4 ms·
Don't know about clojure (is that a lisp?), here when is therefore in formal logic - "A implies B". Ex, "If it's raining, the streets are wet". It doesn't "do"
by sdwr 4y ago
Don't know about clojure (is that a lisp?), here when is therefore in formal logic - "A implies B". Ex, "If it's raining, the streets are wet".
It doesn't "do" anything, just sets a constraint which can be matched against later. I took a class on Prolog in school, which works by back-matching against conditionals like that. I remember just sorting a list being mind-bendingly recursive.
I still think there's some funny business going on in the intersection of computable functions, infinite sets and "there exists a _" style conditionals. Can't put my finger on why "there exists a number of the form 2n + 1" feels fine, but "there exists a function in the set of all possible functions" feels wrong.
- kazinator 4y agoThe imperative if in programming is different from the logical if. But it isn't disconnected from logic. In fact, it is closely related to the logical and: it is and with short-circuiting, enabling the left expression to control effects in the right. In Lisp, the two-form if, namely (if x y), can be replaced by (and x y), because and has the right logic and result value, and also the short-circuiting semantics that y is not evaluated if x is false. If we want the logical if, we can use the equivalent expression (or (not x) y), which has the same truth table: x y | (if x y) | (or (not x) y) ------------+-----------+---------------- nil nil | nil | t nil t | nil | t t nil | nil | nil t t | t | t The if/and relationship of course shows up in other languages: if (pointer != NULL) { if (pointer->foo == 42) do(); } --> if (pointer != NULL && pointer->foo) do();