4 ms·
Lisp is versatile as all get-out, so you can program however you want. For example, we can roll like it's 1969: (prog ((a 0) (b 1) (c 0))
by tmtvl 8mo ago
Lisp is versatile as all get-out, so you can program however you want. For example, we can roll like it's 1969:
(prog ((a 0)
(b 1)
(c 0))
(declare (type Fixnum a b c))
:fb-start
(print a)
(incf b a)
(setf a
(- b a))
(incf c)
(when (< c 100)
(go :fb-start)))
- deleted 8mo ago[deleted]
- Joker_vD 8mo agoWhich actually supports the OP's original argument that even with training and getting used to, this syntax reads harder than let a, b, c = 0, 1, 0 fb_start: writen(a) b +:= 1 a := b - a if c < 100 do goto fb-start
- tmtvl 8mo agoLeaving aside the fact that you have at least 4 (EDIT: 5) mistakes in that code, I find it less readable than the Lisp equivalent. The brackets reinforce the structure imposed by the indentation and help me keep track of order of execution. But that's how my brain works and that's why syntax is subjective.
- Joker_vD 8mo agoMy apologies, it should've been (if you insist on indentation) let a, b, c = 0, 1, 0 fb_start: writen(a) b +:= a a := b - a c +:= 1 if c < 100 do goto fb-start Would you care to elaborate about brackets helping with tracking the order of execution? I'm really curious about that part.
- kazinator 8mo agoTXR Lisp, with infix via ifx macro: (ifx (let ((a 0) (b 1) (c 0)) (tagbody fb-start (prinl a) (b += a) (a := b - a) (c += 1) (if (c < 100) (go fb-start)))))
- tmtvl 8mo agoWell, the P in PEMDAS stands for 'brackets'. The clearest example, even though it's rather uncommon: a := x ** y ** z (and that's hoping the language does the OOE for exponentiation arithmetically correctly) versus (setf a (expt x (expt y z))) It's a bit like how Reverse Polish Notation is superior to the infix notation we torture ourselves with (x + y * z or (x + y) * z versus x y z * + or x y + z *).
- Joker_vD 8mo agoBut that's just associativity, not the order of evaluation? E.g. in C# expressions are evaluated strictly left to right, so if it had operator **, the order of evaluation would've been: tmp1 := x, tmp2 := y, tmp3 := z, tmp4 := tmp2 ** tmp3, yield tmp1 ** tmp4 And, eh, I am not really that convinced that a b * c d * x y * z t * p q * + + sqrt + + is much less torturous than a * b + c * d + sqrt(x * y + z * t + p * q)
- kazinator 8mo ago> let a, b, c = 0, 1, 0 That's atrocious; = should never have a lower precedence than comma.
- Joker_vD 8mo agoPlease forward your complaints to Martin Richards @ https://www.cl.cam.ac.uk/~mr10/ https://www.cl.cam.ac.uk/~mr10/ for making this decision. Also, why?
- deleted 8mo ago[deleted]
- kazinator 8mo agoSorry, where did Martin Richards supposedly make this decision?
- Joker_vD 8mo agoThat's how variables are declared in BCPL, the language he designed and implemented in 1967. Keyword "LET", comma-separated list of names, "=", comma-separated list of expressions (that will be used to initialize the variables). For rare cases when one deliberately wants to leave a variable uninitialized, constant-valued expression "?" exists. Anyway, why is this syntax atrocious?