Hello Elixir community,
I’d like to share an Anki flashcard deck I’ve created containing 1,610 cards covering functions from Elixir version 1.19.0-dev.
About the Project
The deck was created as part of a weekend project where I developed a formatter for the ex_doc
library that generates Elixir function definitions in CSV format, which can be directly imported into the Anki app.
What is Anki?
For those unfamiliar, Anki is a flashcard application that uses spaced repetition to help with memorization and learning - perfect for remembering programming language functions!
Download
You can download the deck here: Elixir 1.19.0-dev Functions Anki Deck
Feedback and suggestions are welcome!
6 Likes
Great minds think alike! I also did this recently and have been memorizing functions and macros from the Kernel
module. I wasn’t sure how it’d work out, concerned that the auto-generated cards would be not easy to memorize or boring to learn, but it’s been mostly fine and worth it, I think.
I’m only doing the first sentence of each function or macro, not the whole doc string, though. I think that helps with parsing and going through the spaced reps.
I also structure my notes with a few fields. I extracted data using a Livebook and this hastily coded snippet:
defmodule Ankify do
def extract_deck(module) do
Code.fetch_docs(module)
|> elem(6)
|> Enum.reject(fn {_, _, _, doc, _} -> doc == :hidden end)
|> Enum.map(&parse_doc(&1, module))
# |> Enum.map(fn note -> Map.values(note) |> Enum.join("\t") end)
# |> then(fn notes -> Enum.join(notes, "\n") end)
end
def parse_doc({{kind, name, arity}, _, [signature], %{"en" => item_doc}, _}, parent) do
[description | _] = String.split(item_doc, "\n\n")
description = String.replace(description, ~r"\n+", " ")
parent = Atom.to_string(parent)
%{
id: "#{parent}.#{name}/#{arity}",
parent: parent,
type: Atom.to_string(kind) |> String.capitalize(),
signature: signature,
description: description
}
end
end
This then has two cards, one to recall the description from the signature and one to recall the signature from the description.
I was planning to polish this up and share as a script but never got around to it.
2 Likes
Nice way you did it. I hope to make improvements to my code which is still very simple, and when it’s more professional I intend to think of a way to share it on GitHub. I believe that for ex_doc it doesn’t need to have this format. I want to do it in a way that makes it simple to generate decks for any Elixir library. Thank you for your response.
2 Likes