3 ms·
how do you write it in other languages? sin(cos(10.4)); or v = 10.4; c = cos(v); s = sin(c); in Lisp one might write: (let* ((v 10.4)
by lispm 8y ago
how do you write it in other languages?
sin(cos(10.4));
or
v = 10.4;
c = cos(v);
s = sin(c);
in Lisp one might write:
(let* ((v 10.4)
(c (cos v)))
(sin c))
really old style:
(prog (v c s)
(setq v 10.4)
(setq c (cos v))
(setq s (sin c))
s)
- __rompy 8y agoWhy not write it as in lisp as: (sin (cos 10.4))
- lispm 8y agoThe question was for alternatives to code that reads inside->out. I personally don't have a problem with it, but I can see that many languages have a more procedural/imperative top->down control flow by default. A Java programmer might prefer that, where a Lisp programmer will be trained to alternate while reading between inside->out and outside-in in code.
- ngcc_hk 8y agoStill using those long expression is unfair A(b(c)) are 2 function calls. Hence (A (b c)) is the fair abd equal expression. And you inside out whilst valid and in fact easier to read (as more normal) would need precedence rule in other scenario. But those examples just not right.
- Riverheart 8y agoThanks for the reply! I'd go the first route unless method chaining was available. SomeData.ToString().Trim() I would like to write idiomatic Lisp code and it's getting easier to read the nested expressions but it breaks the flow to leave the expression and wrap it. Another user mentioned using a command with Emacs to escape the expression and auto wrap it. That might be what I'm looking for.
- kazinator 8y agoThis is the TXR Lisp interactive listener of TXR 215. Quit with :quit or Ctrl-D on empty line. Ctrl-X ? for cheatsheet. 1> [chain tostring trim-str] #<intrinsic fun: 0 param + variadic> 2> [*1 3.4] "3.4" 3> [[chain tostring trim-str] 3.4] "3.4" No ready example of a datatype that requires trimming after a string conversion! We'd have to write one: 4> (defstruct foo nil (:method print (me stream pretty-p) (put-string "foo " stream))) #<struct-type foo> 5> (tostring (new foo)) "foo " Okay we are in business: 6> [[chain tostring trim-str] (new foo)] "foo" Method chaining syntax is possible, but with actual methods only. Most library functions aren't methods; you have to roll your own: 1> (defstruct accum nil (val 0) (:method inc (me : (delta 1)) (inc me.val delta) me) (:method mul (me : (factor 2)) (upd me.val (* factor)) me)) #<struct-type accum> 2> (new accum).(inc).(inc).(mul 3) #S(accum val 6) 3> (new accum).(inc).(inc).(mul 3).val 6 Support for idiom isn't the result of a conscious design decision; it just arises naturally when you have this sort of postfix syntax. TXR's dot syntax is a very straightforward sugar for Lisp structure. Basically x.y.z == (qref x y z). Whitespace is not allowed around the dot. Numbers are also not allowed: 3.4 is a floating-point constant and a.3 or 3.a are invalid. If the leading element is missing, then it's the uref (unbound ref) operator: .y.z == (uref y z). This compiles to a function resembling (lambda (obj) obj.y.z).
- lispm 8y agoThat's the same as: (chain somedata (tostring) (trim)) It's a macro away in Lisp. But I would not use it much, since it kind of defeats the advantage of using nested expressions -> they are actually nested.