5 ms·
Unpacking Elixir: Syntax
- amadeuspagel 3y ago> It is fair to note that end has a lot more characters than } but I do think it comes across as more human. It's also easier to type on non-QWERTY keyboard layouts (including the portuguese layout), where you need the Alt Gr key (the right alt key) to type curly braces.
- lawik 3y agoHad not thought about it. But I and my nordic keyboards agree.
- sph 3y agoSpeaking of, anyone know of a simple Emacs mode to automatically add "end" when I write "do" in elixir-mode? Ideally something language-agnostic. I know smartparens can do that, but I want something smaller and more focused. I'd love if electric-pair-mode could do pairing with words, not only brackets.
- giraffe_lady 3y agoThis says smartparens can do it but I don't know how. But there's a snippet for hacking it out of ruby completion that works for me. https://github.com/elixir-editors/emacs-elixir#pairing https://github.com/elixir-editors/emacs-elixir#pairing
- alwaysbeconsing 3y agoA alternative that is builtin might be an skeletons (and abbrev) or tempo? Also see the newer implementation, tempel: https://github.com/minad/tempel https://github.com/minad/tempel
- jagaerglad 3y agoI use Ctrl+Alt as a substitute for Alt Gr making it feel as natural as typing any other shift-bound special character on the right side of keyboard It's standard on windows but I have to resort to a hacky solution to make it work on linux unfortunately (still don't have a nice way of doing it cleanly so suggestions are welcome, currently it's an autokey script where e.g. ctrl+alt+0 prints '}', which isn't elegant, doesn't work in wayland etc)
- limecat 3y agoI use autokey not as a hotkey but as text expansion. If I type "..c" then this is expanded into "{}" with the cursor inside the braces. And to surround text with "{}" I use ",,c", hence "whatever,,c" becomes "{whatever}". I have similar text expansion for other symbols that require AltGr, square braces are ..s and ,,s for instance. On Windows Autohotkey can do the same, just the scripting language is different. The Autokey text for curly braces is simply "{}<left>" and for surrounding with curly braces the script is: import time keyboard.send_keys("<shift>+<ctrl>+<left>") time.sleep(0.25) sample = clipboard.get_selection() keyboard.send_key("<delete>") keyboard.send_keys("{%s}" % sample) Maybe it helps you.
- jagaerglad 3y agoThat is actually very smart and helpful, thanks! :) My only gripe with autokey is that it's the only thing holding me back from wayland. Hawck is supposed to work with wayland but I never got it to work, was a while ago I tried though https://github.com/snyball/Hawck https://github.com/snyball/Hawck
- limecat 3y agoI don't use Wayland, but it seems xdg-desktop-portal since 1.16.0 has a 'Global Shortcuts portal'. Perhaps check it out. https://github.com/flatpak/xdg-desktop-portal https://github.com/flatpak/xdg-desktop-portal
- lkuty 3y agoThat's the sort of reason that made me switch to US Qwerty a couple of years ago and as a programmer I should have done that from the very beginning instead of staying on Azerty BE. The shortcuts of most programs have been thought for Qwerty (thinking about you Vim). It made my developer's life much easier. I am on macOS and I had to install Karabiner and goku (https://github.com/yqrashawn/GokuRakuJoudo https://github.com/yqrashawn/GokuRakuJoudo) to get the french accented letters. Now right-alt+e gives me é, right-shift-alt+e gives me è, etc. BTW, I love Elixir.
- matrss 3y agoAre you aware of the "EurKEY" layout (https://eurkey.steffen.bruentjen.eu https://eurkey.steffen.bruentjen.eu)? As a european, I think a US ansi keyboard with eurkey is the best option available, if you want to stick with something "standard". On linux it should even be available by default, although Gnome hides it behind some gsettings option. For macos there seems to be some installation involved: https://github.com/jonasdiemer/EurKEY-Mac https://github.com/jonasdiemer/EurKEY-Mac.
- lkuty 3y agoIt looks very interesting. Might give it a try even if I am now used to my key combinations to get the accented letters.
- az09mugen 3y agoA friend of mine switched on mac os recently and as a french dude had trouble making accents. Do you know you can keep the vowel pressed on the keyboard to have accent suggestions like on mobile ? And mac native of course. It changed his way of writing. Hope it helps you.
- el_oni 3y agothe lsp (or maybe it's my editor) will also automatically do a closing `end` for every `do` similar to autobraces where typing an open `{` will automatically add a closing `}` it means that most of the time i don't think about `end` unless it's an anonymous function `fn x -> x end`, which is where the only place i ever forget to add `end`
- paradox460 3y agoProbably no small part to Jose Valim speaking Portuguese
- nine_nines 3y agoGood run-through! Just a small issue, the trailing `Map.put/3` in `add_defaults/1` is missing a key and value.
- lawik 3y agothanks
- anonymousDan 3y agoI wish that elixir had some syntax to simplify variable rebinding when returning from an if statement (as opposed to an if else). For example, some way to say leave the variable unchanged if the if statement is false instead of having to clutter up the program with one line else clauses. Eg. myvar = 5 myvar = if somepredicate() do 200 end Will currently assign None to myvar if somepredicate is false.
- phanimahesh 3y agoI prefer explicit readability. Alternatives I can think of are unappealing.
- Dowwie 3y agomyvar = 5 myvar = if somepredicate() do 200 else myvar end
- lkuty 3y agoThe wish of the OP is to avoid writing "else myvar". You could write a macro I guess. Something like the one below. Not that I have named the macro cond_assign for conditional assignment but there is no real assignement in Elixir, it is the match operator. Here we restrict its usage to "assignment" so expr1 should be a variable. defmodule OurMacro do defmacro cond_assign(expr1, expr2, do: block) do quote do unquote(expr1) = if unquote(expr2), do: unquote(block), else: unquote(expr1) end end end iex> import OurMacro OurMacro iex> myvar = 5 5 iex> cond_assign myvar, false, do: 200 5 iex> myvar 5 iex> cond_assign myvar, true, do: 200 200 iex> myvar 200
- lkuty 3y agoHere is a better version that checks if expr1 is a variable. The condition "is_atom(x)" might be too strong. defmodule OurMacro do defmacro cond_assign(expr1, expr2, do: block) do case expr1 do {x, _, y} when is_atom(x) and is_atom(y) -> nil _ -> :erlang.error(RuntimeError.exception("The lvalue is not a variable: #{Macro.to_string(expr1)}")) end quote do unquote(expr1) = if unquote(expr2), do: unquote(block), else: unquote(expr1) end end end
- boxed 3y agoSpelling/grammar: > Elixir is functional language It's A functional language. > before-hand beforehand > They don’t deal with failure or anything like that but in functional life there are many cases where this just becomes much more readable I would rewrite that entire sentence to "They don’t deal with failures or anything like that but in a functional life there are many cases where this becomes more readable" > that don’t feel like normal Elixir code. Odds are you are Should not be a period I think, but a comma.
- nesarkvechnep 3y agoYou must’ve understood what the author meant before correcting, right?
- rhizome31 3y agoThis would probably be best sent directly to the author since they provide their email address at the bottom of the article with an explicit call for feedback.
- WaffleIronMaker 3y agoGreat article! The phrase "true and false are both atoms" confused me, as I didn't know what atoms were, but I'm not quite sure how that information could be included earlier without feeling jarring. Also, "Not that there is only one type of pipe |> and it feeds the output into the first argument of the next function." Did you mean "Note that"? Either way, thanks for sharing! I'm excited to learn more about Elixir.
- manmal 3y agoHaving dabbled a bit in Elixir during the last year, I've been wondering why function "overloads" are a thing in Elixir, since they (as the author points out) seem to be equivalent to `case` expressions. Do polymorphic functions provide any tangible benefits?
- OkayPhysicist 3y agoThe big advantage is that it saves two levels of indentation and a lot of repeated pattern matching. def equal?(x,y) when x == y do true end def equal?(_,_), do: false would be equivalent to def equal?(x,y) do case {x,y} do {x,y} when x == y -> true _ -> false end end It's also handy in places like GenServers, where from a reading perspective clustering the hooks and their helper functions together is far more readable than the alternative. def handle_call(:msg1,_from,_state) do helper1() helper2() etc... end def helper1(), do: 1 def helper2(), do: 2 def handle_call(:msg2,_from,_state), do: :err Is a lot better than def handle_call(msg,_from,_state) do case {msg, _from, _state} do {:msg1,_from,_state} -> helper1() helper2() etc... {:msg2,_from,_state} -> :err end end def helper1(), do: 1 def helper2(), do: 2 Especially remembering that you'll likely have a lot more than 2 message callbacks.
- ch4s3 3y agoI wouldn't really call them overloads, but you're right they are a lot like case statements. The benefit is that you can combine them with pattern matching to vastly simplify how you handle edge cases. You can pull nil and error handling out of your main logic and into function heads. You can easily separate logic for different input types and values. You can do all sorts of cool stuff with it.
- lawik 3y agoI believe they literally compile down to case statements.
- 3y ago
- username3 3y agoComma after first_value? def eat_value([first_value, | _rest_of_list]) do