6 ms·
Python vs Clojure
- jacquesm 17y agoThe author seems to be strongly biased against python. I'm no great fan of some of pythons choices but I think if you find x things wrong with python and 0 wrong with clojure that that is fairly indicative that this is not a balanced review. Which is a pity.
- gaius 17y agoNot only that, he's wrong - Python is sensitive to indentation, not whitespace. As long as your block is at the right depth, you can have as much whitespace as you want. I regularly format code so similar things line up. This is perfectly valid Python: def foo(): longvariable = 1 x = 2 Also on the subject of lambdas, this is also valid: def foo(): def bar(x): return x + 5 print bar(5) With a nice clean syntax for nested functions, lack of multi line lambdas is much less of an issue.
- yannis 17y agoThis reminds me of my high school algebra teacher. He would automatically fail you in tests if your equals did not line up. Very neat syntax!
- jacquesm 17y agoInteresting how your variable example is pretty much straight against the python styleguide: http://www.python.org/dev/peps/pep-0008/ http://www.python.org/dev/peps/pep-0008/ I'd do it just like you do though. I find it visually harder to fish those equals signs out of the 'noise' otherwise.
- deleted 17y ago[deleted]
- gaius 17y agoIn the wild, you're more likely to find Python that looks like: longvariable, x = 1, 2 However this won't work: longvariable, x = 1, foo(longvariable) So I like to keep things uniform regardless of the rvalue. Also violating the style guide, I like longvariable = "hello" # some description of longvariable x = 1 # some descrption of x
- JshWright 17y agoTo give an example in reply to the Clojure snippet that is now mysteriously missing from the article (to demonstrate something Python users should be jealous of)... This is perfectly valid in Python: users = [ # Name ID Age Phone ['John', 5, 37, '555-1234'], ['Bill', 5, 29, '555-4321'], ['Jean', 5, 32, '555-4132'], ] Edit: Always a good idea to test even the simplest snippets before posting them...
- jacquesm 17y agoTell me about it :) Three lines, 5 bugs I think is my record to date.
- hendler 17y agoFrom the blog - "I'm a professional freelancer working exclusively in Clojure."
- moe 17y agoWhich is not really an excuse for bashing a language on your blog that you clearly haven't even used beyond a hello-world... He probably could write an interesting clojure piece - if only he left out the uninformed ranting.
- jacquesm 17y agoI think if you want to do a meaningful comparison of two programming languages you should be about as proficient in both.
- danh 17y agoI'm not sure meaningful comparisons of programming languages are even possible. It's a bit like asking if English is better than Spanish. What you can do is compare experiences using a given language. E.g. "Our project using language N went quite well", or "I had a good time in Mexico". Debating the syntax of for-comprehensions, or the value of the subjunctive, may be fun, but it never really leads anywhere.
- jacquesm 17y agoI think that it is not like 'is english better than spanish', I think it can be: Is English or Spanish a better language to communicate in for a specific purpose, just like is Python or Clojure a better language to achieve a certain goal in. So, without the context of that goal a comparison is meaningless. But, let's say we create a certain application (let's say an accounting program, or a spreadheet) in both clojure and python, feature-for-feature identical, user interface identical and so on, then a comparison becomes possible. How long did it take to complete the project ? How easy is it to change the program to conform to some new specification ? How fast does it execute ? And so on. It all boils down to the old benchmark problem, a benchmark in a vacuum is meaningless, you have to test using real applications.
- jongraehl 17y agoHe did the same sort of hatchet job on Scala a month ago.
- icey 17y agoI like Clojure, but this whole article strikes me as thinly veiled language trolling. It's not a comparison, it's a long blog posting talking about how Lau thinks Clojure is better than Python.
- jacquesm 17y agoWhat's veiled about it ?
- icey 17y agoI am willing to give him some benefit of the doubt because I've had interactions with the author in #clojure on irc in the past and I don't think he's got bad intentions. He just has strong opinions about things.
- jacquesm 17y agoI'm cool with that, but if you have strong opinions pro one language and contra another, and lots of experience in one language and almost none in the other (even I can tell that, and I'm pretty much a newbie to both python and clojure) then you shouldn't make comparisons. It is a disservice to clojure as well, because it makes people think that clojure proponents are thinking about clojure in terms of religious dogma, instead of rationality.
- deleted 17y ago[deleted]
- tsally 17y agoOff topic, but anyone have any idea what that color scheme is?
- mqt 17y agoIt's "charcoal black" from the emacs color theme package. http://gnuemacscolorthemetest.googlecode.com/svn/html/charcoal-black-c.html http://gnuemacscolorthemetest.googlecode.com/svn/html/charco...
- deleted 17y ago[deleted]
- req2 17y agoAs with most language comparisons, the author is clearly established on one side of the fence and unwilling to investigate in any meaningful sense. He begins with a somewhat spurious statement on how code must be arranged, continues with a complete misunderstanding of what most people mean by scope, and then accuses Python of innumerable memory leaks and associated bugs before he even gets through his first set of comparisons. He claims Python dictionaries abuse the term 'immutable', but they most decidedly never make any such claim. You might learn something about Clojure, but take everything he says about Python with a grain of salt. (Anyone who is interested in concurrent Python should check out multiprocessing, not threading.)
- kljensen 17y agoClojure seems super cool. But, 99% of my tasks - are simple & easily accomplished in Python; and - do not require any concurrency. It seems like Clojure would be super useful in number crunching like scientific computing, etc.
- bretthoerner 17y agoI posted this there, but I feel more people prefer to read comments here. --- First, I love both Python and Clojure, and completely agree that Clojure is more functional and aimed towards concurrency (this was its goal, after all). But I feel like you're doing Python wrong here. > I think this should make a Pythonist a little jealous No, I think you misunderstood the whitespace rules for Python. First, it isn't set to "4 spaces", it just has to be uniform. You could use 8 tabs if you wanted, or 2 spaces, or 7 spaces. Also, inside of data structures, strings, function calls, etc you can go whitespace crazy. This is valid Python: users = (# name , id, age, phone ("Frank", 200, 22, "555-1234"), ("Johnathan", 201, 24, "555-3213"), ("Peter ", 202, 101, "555-2312")) > The last print statement outputs "10" which is surprising to me, since y has never been declared in that given scope. But it wasn't declared in that scope, there is no scope for 'if'. It may not be what you're used to but you can't blame Python for your assumption of what should have it's own scope or not. > To resolve it you have to manually call 'del y' What do you mean to resolve it? Why are you deleting the reference at all? You very rarely see 'del' in real Python code. > but I can't count the number of C app's that have suffered from memory-leaks and what not, based on the lack of automated garbage collection What does that have to do with Python? It is reference counted, those values will be deleted when they go out of all scopes, just like in Clojure. > But this is very different from Clojures concept where immutable means: 'x' never changes. That isn't what it means in Clojure at all. user=> (def x 1) #'user/x user=> x 1 user=> (def x 5) #'user/x user=> x 5 I just changed 'x'. What immutability means is that the value 'x' points to does not change. And that's exactly what it means in Python, too, but dictionaries are mutable (and this is documented). For example, strings in Python are immutable, just as in Clojure. If two things reference the same string and one "changes" it only means that it references a wholly new string. > Guido is not preparing to transition into modern programming That's a little extreme. Concurrent programming is valuable, but there will also be many programs that fit single process / thread models very well until the end of time.
- dreish 17y agoI agree for the most part, but incidentally you would never (def x 1) and then (def x 5) in a running program -- you would use an atom, ref, or var instead. Redefinition of a symbol is permitted so you don't have to quit and restart your REPL every time you rewrite a function. A more meaningful objection is that you can shadow a local with a different local in Clojure, like this: (let [a (some-calculation) b (something-else) a (some-function-of a b)] a) which is essentially what is being done in the Python code. I don't think there are many strong arguments to make in favor of Clojure over Python other than concurrency and macros, and maybe the immutable hashes.
- clemesha 17y agoEvery time I hear criticism of Python's whitespace (indentation), I am reminded once again of how much I appreciate and enjoy it.
- jacquesm 17y agoTo me it's a mixed bag. It's like a 'price of admission', if you've been conditioned a life long to look for matching braces (or at least begin, end pairs), and if even languages that are strictly speaking markup languages seem to feel the need for delimiting the end of a block in some way you alienate a large number of people before they've even written a single line. Compound that with the difficulty of passing code snippets using various media and it is easy to see why so many people argue against this. You can get used to it, sure. But that's not a very strong argument. I think there would have been ways to get out of this. Especially when programming using tabs you'd better be very careful not to hit a delete by accident while walking near the end of a block of code. That can really mess you up. edit: also, for that reason alone any discussion about the relative merits of python vs something else first has to get pas the 45% where we talk about the whitespace. And some people will go to extreme lengths to prove its 'goodness' even when clearly it is not only good. Being objective about something you like is very very hard.
- brodie 17y agoIncreased readability and code clarity are well worth the price of admission.
- jacquesm 17y agoReadability is a subjective thing. I find C dead easy to read, that's because I've read lots and lots of it. Any other language is harder for me. edit: on another note, in a delimited language the indentation can be created fully automatic, in python it can not, placing most of the burden of making sure the indentation is correct on the human. This lack of 'redundancy' has bitten me several times already.
- 17y ago
- megaman821 17y agoThis comparison isn't very good. He is basically dinging Python for setting up some pretty basic functions like ireduce(). Wouldn't you do the same in Clojure if something didn't exist? If its just about have short code, I would suggest the line 'import numpy'. Also for the concurrency parts, if you are talking strictly about the languages and not their implementation, why not compare Jython to Clojure?
- jacquesm 17y agoBecause then the comparison would come out less in favour of clojure ? Because the author isn't aware of jython ? It could be anything really, but if you plan on putting down a language I guess you're not going to go out of your way to create a level playingfield. Let's compare interpreted basic with compiled C for an encore.
- jbellis 17y ago> He is basically dinging Python for setting up some pretty basic functions like ireduce() I don't get it. plain "reduce" already works on any iterable.
- pHezy 17y agoIt seems more like a "I suck at python and I try to be cool using clojure" than any other things. Oh, and btw, palindrome: x==x[::-1] or reversed
- deleted 17y ago[deleted]
- japherwocky 17y agotl;dr: author without much python experience writes a tedious article in Clojure's favor.
- johnfn 17y agoWhat bugs me about this article is that the solutions he takes for project euler are taken from a website which tries to make Python into a functional language and are needlessly verbose. For instance, the normal way to solve PE#1 is: print sum([x for x in range(1001) if x%3==0 and x%5==0)] Quite a bit shorter than the clojure solution. Further, their "isPalindrome" function involves a "digits_from_num" call, and is almost 10 lines in total. You could shorten that to one if you check pal == pal[::-1]. Essentially, the guy copied code from a website which wasn't really trying to show off how succinct python could be.
- alrex021 17y agoWho is up-voting this? If you read this article you can clearly see the lack of knowledge the author holds in Python language itself. If you gonna do a ... VS ... you better know both sides pretty damn well otherwise it leads to being a somewhat worthless comparison IMHO.
- d0mine 17y agoThere is a bug in the fibonacci example: it sums odd numbers instead of even. from itertools import takewhile def ifibonacci(a=1, b=1): while True: yield a a, b = b, a + b candidates = takewhile(lambda n: n < 4000000, ifibonacci()) print sum(n for n in candidates if n % 2 == 0)