9 ms·
Lisp Flavoured Erlang 1.0 released after 8 years of development
- vdaniuk 11y agoRobert Virding has just announced the release on twitter https://twitter.com/rvirding/status/710259707819249664 https://twitter.com/rvirding/status/710259707819249664 I feel that this LFE release further validates BEAM as a promising platform for future development of new programming languages. Also I look forward to reading SICP converted to LFE. Available chapters can be found here https://www.gitbook.com/book/lfe/sicp https://www.gitbook.com/book/lfe/sicp
- emmanueloga_ 11y agoGiven you mentioned SICP... SICP is cool for its math and its puzzle-like problems, but I found http://scheme.com/tspl4/ http://scheme.com/tspl4/ a much better introduction to Scheme and more likely to help me solve problems with Scheme in the real world (i.e. a good reference book).
- namelezz 11y ago> A proper Lisp-2, based on the features and limitations of the Erlang VM What are limitations?
- jsnell 11y agoOne obvious example is that AFAIK the VM doesn't support functions with a variable number of arguments (foo/1 and foo/2 are two separate functions). This means that you can't have CL-style &rest or &key arguments.
- kazinator 11y agoWhile &key is CL-specific (and if you don't have it, you can ad-hoc it if you have variable arguments) variadic functions are pretty important, and found broadly in Lisp dialects. If you're on a VM or other target that doesn't do them natively, it's worth fighting tooth and nail to somehow get the functionality. E.g. make an inefficient variadic type that at the VM level takes a single argument---a list or vector of the arguments. Or multiple types for different combinations of fixed arg arity plus variable list.
- wcummings 11y ago>E.g. make an inefficient variadic type that at the VM level takes a single argument---a list or vector of the arguments. Or multiple types for different combinations of fixed arg arity plus variable list. This would hurt interop with Erlang, which seems to be a goal of LFE.
- cronjobber 11y ago> variadic functions are pretty important As you already wrote in another comment, most practical uses of variadic functions can be replaced by macros. What remains that is worth fighting the platform for?
- StreamBright 11y agoThis is a feature to me more like a limitation. I do not like optional arguments &rest style. In Erlang you need to have explicit number of arguments and need to explicitly implement them. I really like that. Keep in mind that default values are trivial to implement when the smaller arity function calls the higher arity one with added values. Or you can call in yourself to the higher arity function and specify the parameters yourself. In my opinion this is elegant and safe way of dealing with the problem.
- seiji 11y agoIn Erlang you need to have explicit number of arguments and need to explicitly implement them. Or, you know, just use lists as parameters. That's the standard Erlang pattern for unknown parameters lengths (e.g. io:format("debug ~s because ~p~n", [SomeString, SomeType]))
- kazinator 11y agoFirstly, this still requires a mechanism which underlies the [ ... ] notation for evaluating a sequence of any number of expressions and constructing a list. In Lisp dialects, that is done by a variadic function: (list 1 2 3 4 ...) Of course, if we don't need to indirect on this function, we could implement it as a macro (supposing further that we have variadic macros for compile time, but not variadic functions for run time). The macro would turn (list 1 2 3) into the non-variadic calls (cons 1 (cons 2 (cons 3 nil))). I imagine that's a conceptual facsimile of what Erlang's list constructor notation is doing. Erlang has variadic features in its read syntax; without a doubt its BNF is chock full of "zero or more of ..." grammar productions. The function defining mechanism lets you define a function which has any number of arguments; just that number has to be fixed for that function. So the mechanism itself enjoys variadic application. Here it is asked to define a three-arg function, here a ten-arg, ... We can simulate some aspects of variadic application with syntactic sugar, but not all. A Lisp function call which specifies five arguments can call a function which requires exactly five arguments, or a function which requires three arguments, followed by variadic ones. For instance, if we have a callback registration interface that passes five arguments, the client can supply a fixed arity function, or a variadic one. I suppose that if everything is static, that can still be worked out. The compiler sees that a variadic function with only two required args is passed as a callback that must be 5-ary, so it inserts a conversion shim: an anonymous function which takes exactly 5 parameters and applies them to the 3+rest function.
- wtbob 11y ago> One obvious example is that AFAIK the VM doesn't support functions with a variable number of arguments (foo/1 and foo/2 are two separate functions). This means that you can't have CL-style &rest or &key arguments. But surely one could call a function with one argument, which is a variable-length list of arguments, right?
- rvirding 11y agoSome limitations (?): are no global data; no shared data; all data is immutable; the modules are different from CL packages; functions can't have variable number of arguments[]. It does however have support for decent pattern matching and full access to all of Erlang's concurrency, fault-tolerance and scalability properties. Plus real macros as god intended. [] The macro handling can go part way to hide this.
- oubiwann 11y ago"Macro handling as god intended." I had to laugh :-) That reads like it's out of the Moonual ...
- rvirding 11y agoSome limitations (?): are no global data; no shared data; all data is immutable; the modules are different from CL packages; functions can't have variable number of arguments[]. It does however have support for decent pattern matching and full access to all of Erlang's concurrency, fault-tolerance and scalability properties. Plus real macros as god intended. [] The macro handling can go part way to hide this.
- eggy 11y agoGreat news! I wanted to learn BEAM/OTP, but had tried Erlang briefly years ago, and then went back to Common Lisp. Now I can try to learn BEAM/OTP in a syntax that is more appealing to me than Elixir's Ruby-like syntax. I like Elixir, and it is very popular, but true runtime macros are available in LFE 1.0. In addition, Robert Virding was one of the co-creators of Erlang, so his devotion to bringing the best Lisp he could to the BEAM platform within its confines, comes with some authority. The Google Group Lisp Flavoured Erlang is a very responsive community and resource for getting started. Congratulations LFE on your v1.0! OT, but I also use Extempore - the music, graphics livecoding environment with a great language, xtlang that I believe was based upon S7 scheme and has an LLVM backend [1]. There are some s-expression to WebAssembly projects floating around too. All around good news for all the choices to work with up front no matter your preferences. [1] http://extempore.moso.com.au/
- sjtgraham 11y agoElixir is really not similar to Ruby and the comparison wears thin. This is my opinion after having used Elixir daily for the last 1.5 years and Ruby for 10 years before that. Elixir really is a brilliant language and José et al have made the developer experience second to none with hex, mix, the language guide and docs. Compare how you bring up a repl: Elixir, type iex; LFE, cd into LFE dir, type ./bin/lfe. (EDIT: this is incorrect, see child) Trivial example and something easily fixed if it bothers you, but it's emblematic of the attention to detail that has gone into devx. I am deeply in love with Elixir. That Robert co-authored Erlang should not mean giving Elixir any less consideration IMO. That said I sincerely wish to congratulate Robert on this 1.0, I look forward to using LFE in anger for something very soon now it is 1.0 (and it will be easy to slip in an LFE module into one of my OTP apps). Exciting times for the Erlang ecosystem.
- masklinn 11y ago> Compare how you bring up a repl: Elixir, type iex; LFE, cd into LFE dir, type ./bin/lfe. Is that a joke? > If you have installed LFE, then you may start the REPL from any location: $ lfe what you quoted is if you're running LFE straight from the git clone[0], and noted so. [0] because you may not want a system-wide LFE and LFE is being a nice citizen in explicitly supporting that use case.
- andrewvijay 11y agoJust waiting for the day when someone launches a js version then the whole world is gonna be coding on erlang vm I think.
- sjtgraham 11y agoI doubt it. IMO Erlang is fundamentally a different model of programming than JS and what about mutability and things such as pattern matching? It quickly becomes apparent that it would not be much like JS if it was to take advantage of all of Erlang's best bits.
- vdaniuk 11y agoElixirscript is a thing though and it's being actively developed https://github.com/bryanjos/elixirscript https://github.com/bryanjos/elixirscript
- andrewvijay 11y agoIt's a good one to know about. Thanks!
- koder2016 11y agoExactly, Erlang is a DSL for distributed applications. There is not much point to use it for anything else.
- tazjin 11y agoErlang and related languages are applicable for most long-running applications. The amount of people who actually use true distributed Erlang is probably small, because you get many of the benefits either way.
- seiji 11y agoErlang is a DSL for weeding out smart programmers from drone programmers.
- 11y ago
- diskcat 11y agoCould you believe that 2016 is the year of the beginning of the LISP renaissance. Im going to buy some spare paren keys, they might become scarce in the immediate future.
- macmac 11y agoIt started in 2007 with the release of Clojure and there are still plenty of paren keys around.
- 50CNT 11y agoNow what you want it foot pedals. 3 for emacs and another double pedal for parens. Configure using M-x drumkit.
- macmac 11y agoGiven the original theme for the MIT SICP lectures was magic, I think some kind of hand motions would be more appropriate.
- lispm 11y agoThe Lisp renaissance started in December 1999 with SBCL being forked from CMUCL.
- eggy 11y agoSadly, I am old enough to agree with this assertion. I went from SBCL to ECL at one point looking for a small Lisp t embed or make games with, purely a hobby. I have not left the Lisp renaissance since!
- jhbadger 11y agoOn the other hand, 1999 was the downfall of LISP in the statistical community because that's when Luke Tierney decided to stop working on LISP-STAT, a LISP dialect with extensions for statistics that was semi-popular before the advent of R. While there have been statistical systems based on LISP since (such as Incanter for Clojure and a port of many of the extensions of LISP-STAT to Common Lisp) none have managed to make a dent against R, unfortunately.
- Kuytu 11y agoRobert Virding gave a short talk on LFE at ClojuTRE last year: https://www.youtube.com/watch?v=BvCBTpnlqs8 https://www.youtube.com/watch?v=BvCBTpnlqs8
- hellofunk 11y agoVirding's YouTube presentation at a Clojure conference about this new lisp says this in the caption: >LFE (Lisp Flavoured Erlang) has been designed to run efficiently on the Erlang VM and at the same time be a "real lisp" providing Lisp's good bits. It also knocks Clojure a bit. What do you all think are the "good bits" of lisp that Clojure lacks?
- kaeluka 11y agoFWIW, reading this sentence w/o any extra context, it doesn't seem to imply anything bad about clojure.
- hellofunk 11y agoThe bit about Clojure was additional information in the source that I did not quote.
- ska 11y agoWhat do you all think are the "good bits" of lisp that Clojure lacks? Compared to common lisp off the top of my head (correct me if I am misrepresenting Clojure from memory): condition system, multiple return values and &key, CLOS with all that entails, and I seem to remember that clojure had some fiddly issues with macros and reader macros. Not intended as a knock on Clojure, btw, but the JVM is somewhat limiting, in the same way you can't do a "proper" common lisp on the CLR.
- eggy 11y agoReadable stack traces. Unfortunately, the JVM is the culprit here. I like Clojure's syntax, and some other bits, but if I were to chose a Lisp that runs under another system like Clojure, I'd choose Shen [1]. [1] http://shenlanguage.org/
- hellofunk 11y ago>The Shen kernel is under BSD and currently runs under CLisp, SBCL, Clojure, Scheme, Ruby, Python, the JVM, Haskell and Javascript. Hm, I guess I can't imagine how that would work, one language running under all those environments?
- clw8 11y agoMy exposure to the Erlang world is limited to having read the first few chapters of Programming Elixir. Is interop trivial? Can you easily use Erlang, Elixir, and LFE in the same project?
- lpil 11y agoYes, compiling a module where the source was written in another language is no different from calling a module written in the same one. In Elixir any time you call a module that starts with a `:` it has most likely been written in Erlang.
- sjtgraham 11y agoTechnically all modules begin with : as module references are atoms. iex just hides it from for Modules made with defmodule (they have :Elixir prepended to them) /trivia
- akavel 11y agoI've stumbled into an interesting related comment on twitter, didn't know: "#Erlang based language ecosystem is more diverse than many know: #efene #reia #lfe #luaerl #erlog #elixir #mercury" https://twitter.com/BillBarnhill/status/670601359016771584 https://twitter.com/BillBarnhill/status/670601359016771584 edit: Wow, and many of them seem to actually be by the same rvirding who authored lfe: https://github.com/rvirding/luerl https://github.com/rvirding/luerl https://github.com/rvirding/erlog https://github.com/rvirding/erlog
- i_feel_great 11y agohttp://the-concurrent-schemer.github.io/scm-doc/ http://the-concurrent-schemer.github.io/scm-doc/
- eric_bullington 11y agorvirding was also one of the creators of Erlang itself at Ericsson.
- vvanders 11y agoShame about luerl not supporting __metatable properly. That's half of why Lua is awesome. Still a massive achievement, awesome stuff.
- rvirding 11y agoMain issue is that luerl does support metatables. That caveat was written ago and I can't remember what it was I didn't support then. But as I said now it works.
- vvanders 11y agoKudos! That's really awesome then. I've got a lot of love for Lua(works great in embedded spaces, we use to do game logic in ~400kb block on a PSP with ~8mb of RAM). Metatables are such an great way of exposing composability without putting a lot of restrictions on how the language works.
- philjackson 11y agoI'd love to see a comparison with Clojure, anyone know of such a thing yet?
- StreamBright 11y agoYou can answer this from many angle: - Clojure vs LFE - JVM vs BEAM - Lisp-1 vs Lisp-2 Etc, if you are interested only in the syntax differences, there is not much difference there (there are obviously some though!). I think generally speaking Erlang has fewer libraries than Java so that is a big difference in my opinion.
- rvirding 11y agoOne major difference between the JVM and the BEAM is the type of application they target. The BEAM is designed to implement Erlang so it supports everything necessary to run Erlang at the base level. It is concurrency, fault tolerance and scalability from the very bottom all the way to the top.
- oubiwann 11y agoIt's a work in progress, but this might be useful: * http://lfex.github.io/hyperpolyglot/ http://lfex.github.io/hyperpolyglot/
- philjackson 11y agoGreat - thanks.
- seiji 11y agoElixir is really not similar to Ruby and the comparison wears thin. Wasn't Elixir just created because 100%-Ruby-til-Death programmers refuse to learn any other non-ruby-like syntax? It's like their brains would shatter into a brillion pieces if they ever had to think about tail recursion. have made the developer experience second to none Except, LFE isn't a giant community and companies and organizations and conferences promoting its usage and building companies around it. LFE is a nice project that grows as people use it without trying to form an army/cult around it like so many other languages do these days. and, if you think 'cd' is a complex operation, your brain would explode at trying to start the LFE REPL for most of its life: erl -noshell -noinput -s lfe_boot start
- phamilton 11y agoNope. Elixir was created because of the gap in functionality in Erlang, specifically around documentation and tooling as well as the lack of macros and polymorphism. [0] The fact that it looks Rubyish at times is just the creator's aesthetic preference, but it wasn't the motivator. [0] http://www.sitepoint.com/an-interview-with-elixir-creator-jose-valim/ http://www.sitepoint.com/an-interview-with-elixir-creator-jo...
- pmarreck 11y ago> It's like their brains would shatter into a brillion pieces if they ever had to think about tail recursion. Come on, man. Your anti-Rubyist bias is showing way too clearly. I switched to Elixir from Ruby (or rather, am still trying to move all my project work over), and I grokked tail recursion just fine. > LFE is a nice project that grows as people use it without trying to form an army/cult around it like so many other languages do these days No product (language or otherwise; trying to include Apple, here) ever "tried to form a cult around itself." That is just a natural happening when a new thing is really really cool. So discounting something because of its popularity is sort of an "argumentum ad populum" fallacy in reverse (arguing for OR against something because of its popularity).
- dang 11y agoPlease keep programming language flamewars off HN.
- jarpineh 11y agoThis looks really interesting. I installed it easily through Brew. REPL seems to work fast. Now if my Clojure flawored Lisp starter level knowledge could be somehow transformed into Erlang flawor... I wrote this: > (map (lists:seq 1 10) (lambda (a) (io:format a))) and this happened: #M((1 2 3 4 5 6 7 8 9 10) #Fun<lfe_eval.12.88887576>) So, I'm not quite there yet. Hopefully somebody can make a Clojure to LFE comparison. And using Elixir based things like Phoenix springs to mind...
- strmpnk 11y agoMap is a constructor in this case. You'll want lists:map/2 (fn comes first). I don't know LFE much so there may be sugar of sorts for this, perhaps a comprehension syntax.
- rvirding 11y agoYes, there are list comprehensions but they return the list of values: (lc ((<- x (lists:seq 1 10))) (lfe_io:format "~p" x))
- jarpineh 11y agoThank you both. I didn't realize how Erlang flawored this really is. This did the trick: > (lists:map (lambda (a) (io:format (integer_to_list a))) (lists:seq 1 10)) Though all those OKs look kind of superfluous. I must read Erlang tutorial or two before I proceed.
- macintux 11y agoio:format is a side-effecting function. It prints to the terminal. The atom ok is the return value. If you want to create a list of strings, this works: > (lists:map (lambda (a) (lists:flatten (io_lib:format "~B" (list a)))) (lists:seq 1 10)). ("1" "2" "3" "4" "5" "6" "7" "8" "9" "10")
- alberth 11y agoSlightly off topic: does anyone have an update on BEAM JIT?
- aidenn0 11y agoThe users manual has a stub section for macros; does anybody know how LFE macros work? It says "lisp style" but that allows at least 4 options (syntax pattern-matching versus classic defmacro, and capturing versus non-capturing).
- aweinstock 11y agoThere's some more in-depth documentation in the repo in doc/user_guide.txt, at around line 520-ish. It has Common Lisp style defmacro (augmented with pattern matching), and Scheme-inspired defsyntax. The documentation warns that both are unhygienic, and `grep -ri gensym` didn't find anything in the repo.
- aidenn0 11y agoSo I guess you just have to be super careful with variable and function names? That's the dark-ages for lisp, but still usable.
- rvirding 11y agoI do want to point out that LFE has been release ready and of production quality for a long time but I tend to suffer from a "Jag ska bara"* syndrome which has delayed things. :-) * I am just going to ...
- piokuc 11y agoThank you so much for this wonderful stuff!
- im_down_w_otp 11y agoThe docs are sadly very incomplete still. :-( How do I go about sponsoring a technical writer to complete them?