Oriel Jutty :hhHHHAAAH:

Indoor European. I know #regex. I write #code (in #C or #Haskell or #Perl or #JavaScript or #bash).
100% OPSEC.

Kompatibel mit handelsüblichen Klemmbausteinen.

  • 0 Posts
  • 43 Comments
Joined 3 years ago
cake
Cake day: November 6th, 2022

help-circle
  • Yeah if you just ignore all the other control characters you had to add instead then you sure saved on parens. Bravo!

    Yes! Exactly! Thank you; that was my whole point.

    Your whole argument is basically treating parens as something different from other syntax characters, which is a nonsensical argument. If you’re going to compare syntax then you have to compare all the syntax you have.

    I’m not trying to compare syntax in general. All I’m doing is refuting the original claim, which was that Lisp doesn’t use more parentheses than other (“conventional”) languages. It does.

    All that stuff about syntactic noise, granted. I mean, I don’t agree personally, but it’s irrelevant to my point.


  • Let’s take a step back. I feel this discussion has got off track a bit.

    The original claim was that Lisp’s reputation as having lots of parentheses was undeserved because it uses the same number of parens as other languages that use () for function calls; Lisp just puts the parens in a different place.

    My objection was basically that Lisp also uses parentheses for what in other languages is a declaration, a statement, a block, an operator, etc so just looking at function calls doesn’t give you the whole picture.

    You said that “Lisp” is actually a family of languages, that Clojure uses fewer parens than other Lisps (I object: still more than non-Lisps), that there are macros for infix expression syntax (I object: non-standard/3rd-party solutions that only help with operators), that parens don’t even matter because of structural editing tools (I object: irrelevant, the discussion was about the number of parens, not whether they “matter”).

    I also disagree with “the total number of parens in your examples is about the same”. This is a micro-example, so when the original Lisp (Clojure) code has 4 pairs of parens and the C-style (JavaScript, Perl) version has 2, that’s twice the parentheses to me, not “about the same”.

    I’ve tried to find a slightly bigger code sample, so I clicked around in the Clojure standard library. Here’s a chunk of clojure.string: https://github.com/clojure/clojure/blob/ade22645ba5dbf4c0d8115b19938af96d6fb4cd5/src/clj/clojure/string.clj#L275-L317

    (defn ^String trim-newline  "Removes all trailing newline \\n or return \\r characters from  string.  Similar to Perl's chomp."  {:added "1.2"}  [^CharSequence s]  (loop [index (.length s)]    (if (zero? index)      ""      (let [ch (.charAt s (dec index))]        (if (or (= ch \newline) (= ch \return))          (recur (dec index))          (.. s (subSequence 0 index) toString))))))(defn blank?  "True if s is nil, empty, or contains only whitespace."  {:added "1.2"}  [^CharSequence s]  (if s    (loop [index (int 0)]      (if (= (.length s) index)        true        (if (Character/isWhitespace (.charAt s index))          (recur (inc index))          false)))    true))(defn ^String escape  "Return a new string, using cmap to escape each character ch   from s as follows:   If (cmap ch) is nil, append ch to the new string.   If (cmap ch) is non-nil, append (str (cmap ch)) instead."  {:added "1.2"}  [^CharSequence s cmap]  (loop [index (int 0)         buffer (StringBuilder. (.length s))]    (if (= (.length s) index)      (.toString buffer)      (let [ch (.charAt s index)]        (if-let [replacement (cmap ch)]          (.append buffer replacement)          (.append buffer ch))        (recur (inc index) buffer)))))
    

    Total number of pairs of parentheses (not counting doc-strings): 45

    My translation of the code to JavaScript:

    function trim_newline(s) {    for (let index = s.length; index > 0; index--) {        let ch = s.charAt(index - 1);        if (ch != '\n' && ch != '\r') {            return s.substr(0, index);        }    }    return "";}function blank(s) {    if (s == null) {        return true;    }    for (let index = 0; index < s.length; index++) {        if (!Character.isWhitespace(s.charAt(index))) {            return false;        }    }    return true;}function escape(s, cmap) {    let buffer = "";    for (let index = 0; index < s.length; index++) {        let ch = s.charAt(index),            replacement = cmap(ch);        buffer +=            replacement !== undefined                ? replacement                : ch;    }    return buffer;}
    

    Total number of pairs of parentheses: 15

    That’s about a factor of 3. Now, you can argue that I shouldn’t care about the parentheses, but my point is simply that they’re there and you can’t really avoid them if you write in anything resembling idiomatic Lisp.


  • I disagree with pretty much everything you write here, but especially this:

    First of all, you have exact same amount of parens as you would in a mainstream language like Java, C, or Js.

    My Perl example uses “mainstream language” syntax. Apparently that doesn’t count because it’s Perl (scary! mental overhead! write only!), so here’s exactly the same thing in JavaScript:

    function hypot(x, y) {    return Math.sqrt(x ** 2 + y ** 2);}
    

    … or

    const hypot = function (x, y) {    return Math.sqrt(x ** 2 + y ** 2);};
    

    … or

    const hypot = (x, y) => Math.sqrt(x ** 2 + y ** 2);
    

    Note how none of these involve four layers of nested parentheses.


  • OK, my code snippets are Common Lisp. But note that none of them involve list/vector/set literals. I was thinking of [] for array indexing and {} for code blocks.

    As for infix macros, sure, that’s not hard to do, but it’s not built into the language and there being “plenty of libraries” is part of the problem: They’re all subtly different, none are standard, and I suspect most people don’t use them anyway. (Plus there’s fun little design issues like whether a*x + b should parse the same as a * x + b, and if it does, then how do you refer to a variable called a*x from an infix environment?)

    It doesn’t solve the main issue anyway. Take this snippet from the “infix” readme:

    (def hypot  (fn [x y]    (infix sqrt(x ** 2 + y ** 2))))
    

    It ends with a cluster of )))) (reinforcing the “lots of parentheses” impression) and all of those parentheses mean something different: From the outside in, we have the end of a symbol definition (def ...), the end of a function (fn ...), the end of a macro invocation (infix ...), and the end of a function call sqrt(...). It definitely isn’t just “the same number [of parentheses] as any other language that uses parentheses to make function calls”.

    Compare e.g. these versions written in Haskell:

    hypot = \x y -> sqrt (x ** 2 + y ** 2)
    

    … or Perl:

    sub hypot($x, $y) {    sqrt($x ** 2 + $y ** 2)}
    

    … or if you want to separate the function and symbol definition parts:

    *hypot = sub ($x, $y) { sqrt($x ** 2 + $y ** 2) };
    








  • There’s a lot of distorted facts here, but the weirdest one to me is “instead of regrouping their efforts (which, I might add, they did, and they got their day in parliament)”. The first half just contradicts itself (“instead of doing X, which they did, …”???) and the second half (“they got their day in parliament”) is verifiably, obviously false: The EU petition is still ongoing and collecting signatures. The deadline is July 31.