aboutsummaryrefslogtreecommitdiff
path: root/locale
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--locale/eo/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po4
-rw-r--r--locale/eo/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po14
-rw-r--r--locale/eo/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po10
-rw-r--r--locale/eo/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po57
-rw-r--r--locale/eo/LC_MESSAGES/_pastebins/2021-04-03-javascript-naive-slugify.po70
-rw-r--r--locale/eo/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po24
-rw-r--r--locale/eo/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po9
-rw-r--r--locale/eo/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po6
-rw-r--r--locale/eo/LC_MESSAGES/_tils/2021-04-24-clojure-auto-curry.po220
-rw-r--r--locale/eo/LC_MESSAGES/_tils/2021-04-24-common-lisp-argument-precedence-order-parameterization-of-a-generic-function.po210
-rw-r--r--locale/eo/LC_MESSAGES/_tils/2021-04-24-three-way-conditional-for-number-signs.po95
-rw-r--r--locale/fr/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po4
-rw-r--r--locale/fr/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po14
-rw-r--r--locale/fr/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po10
-rw-r--r--locale/fr/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po57
-rw-r--r--locale/fr/LC_MESSAGES/_pastebins/2021-04-03-javascript-naive-slugify.po70
-rw-r--r--locale/fr/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po24
-rw-r--r--locale/fr/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po9
-rw-r--r--locale/fr/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po6
-rw-r--r--locale/fr/LC_MESSAGES/_tils/2021-04-24-clojure-auto-curry.po220
-rw-r--r--locale/fr/LC_MESSAGES/_tils/2021-04-24-common-lisp-argument-precedence-order-parameterization-of-a-generic-function.po210
-rw-r--r--locale/fr/LC_MESSAGES/_tils/2021-04-24-three-way-conditional-for-number-signs.po95
-rw-r--r--locale/pt/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po4
-rw-r--r--locale/pt/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po14
-rw-r--r--locale/pt/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po10
-rw-r--r--locale/pt/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po57
-rw-r--r--locale/pt/LC_MESSAGES/_pastebins/2021-04-03-javascript-naive-slugify.po70
-rw-r--r--locale/pt/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po24
-rw-r--r--locale/pt/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po9
-rw-r--r--locale/pt/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po6
-rw-r--r--locale/pt/LC_MESSAGES/_tils/2021-04-24-clojure-auto-curry.po220
-rw-r--r--locale/pt/LC_MESSAGES/_tils/2021-04-24-common-lisp-argument-precedence-order-parameterization-of-a-generic-function.po210
-rw-r--r--locale/pt/LC_MESSAGES/_tils/2021-04-24-three-way-conditional-for-number-signs.po95
33 files changed, 2016 insertions, 141 deletions
diff --git a/locale/eo/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po b/locale/eo/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po
index 86c8389..3c7e6ec 100644
--- a/locale/eo/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po
+++ b/locale/eo/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po
@@ -12,8 +12,8 @@ msgstr ""
msgid ""
"I wrote a simple little tool called "
-"[swift2nix](https://git.euandreh.xyz/swift2nix/) that allows you trick"
-" Swift's package manager into assuming everything is set up. Here's the "
+"[swift2nix](https://git.euandreh.xyz/swift2nix/) that allows you trick "
+"Swift's package manager into assuming everything is set up. Here's the "
"example from swift2nix's README file:"
msgstr ""
diff --git a/locale/eo/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po b/locale/eo/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po
index 0e0bc8c..ecd28a5 100644
--- a/locale/eo/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po
+++ b/locale/eo/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po
@@ -381,18 +381,18 @@ msgstr ""
#~ msgid ""
#~ "I've started a fork of cbindgen: "
-#~ "[x-bindgen](https://git.euandreh.xyz/x-bindgen/). Right now it is just "
-#~ "a copy of cbindgen verbatim, and I plan to remove all C and C++ emitting "
-#~ "code from it, and add a IR emitting code instead."
+#~ "[x-bindgen](https://git.euandreh.xyz/x-bindgen/). Right now it is just a "
+#~ "copy of cbindgen verbatim, and I plan to remove all C and C++ emitting code "
+#~ "from it, and add a IR emitting code instead."
#~ msgstr ""
#~ msgid ""
#~ "When starting working on x-bindgen, I realized I didn't know what to look "
#~ "for in a header file, as I haven't written any C code in many years. So as I"
-#~ " was writing [libedn](https://git.euandreh.xyz/libedn/), I didn't know "
-#~ "how to build a good C API to expose. So I tried porting the code to C, and "
-#~ "right now I'm working on building a *good* C API for a JSON parser using "
-#~ "parser combinators: [ParsecC](https://git.euandreh.xyz/parsecc/)."
+#~ " was writing [libedn](https://git.euandreh.xyz/libedn/), I didn't know how "
+#~ "to build a good C API to expose. So I tried porting the code to C, and right"
+#~ " now I'm working on building a *good* C API for a JSON parser using parser "
+#~ "combinators: [ParsecC](https://git.euandreh.xyz/parsecc/)."
#~ msgstr ""
#~ msgid ""
diff --git a/locale/eo/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po b/locale/eo/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po
index a7e3382..c85754b 100644
--- a/locale/eo/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po
+++ b/locale/eo/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po
@@ -269,9 +269,9 @@ msgstr ""
msgid ""
"For my personal use, I've [packaged](https://git.euandreh.xyz/package-"
-"repository/) `remembering` for GNU Guix and Nix. Packaging it to any "
-"other distribution should be trivial, or just downloading the tarball and "
-"running `[sudo] make install`."
+"repository/) `remembering` for GNU Guix and Nix. Packaging it to any other "
+"distribution should be trivial, or just downloading the tarball and running "
+"`[sudo] make install`."
msgstr ""
#~ msgid ""
@@ -288,8 +288,8 @@ msgstr ""
#~ msgid ""
#~ "Today I pushed v0.1.0 of "
-#~ "[remembering](https://git.euandreh.xyz/remembering/), a tool to "
-#~ "enhance the interactive usability of menu-like tools, such as "
+#~ "[remembering](https://git.euandreh.xyz/remembering/), a tool to enhance the "
+#~ "interactive usability of menu-like tools, such as "
#~ "[dmenu](https://tools.suckless.org/dmenu/) and "
#~ "[fzf](https://github.com/junegunn/fzf)."
#~ msgstr ""
diff --git a/locale/eo/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po b/locale/eo/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po
index 442e6d0..e30c889 100644
--- a/locale/eo/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po
+++ b/locale/eo/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po
@@ -241,25 +241,6 @@ msgid ""
msgstr ""
msgid ""
-"--- 3.c\t2021-02-17 00:15:38.019706074 -0300\n"
-"+++ 4.c\t2021-02-17 00:44:32.306885590 -0300\n"
-"@@ -1,11 +1,11 @@\n"
-" bool a_function() {\n"
-"- char *s1 = malloc(A_NUMBER);\n"
-"+ char *s1 = MALLOC(A_NUMBER);\n"
-" if (!s1) {\n"
-" return false;\n"
-" }\n"
-" strcpy(s1, \"some string\");\n"
-"\n"
-"- char *s2 = malloc(A_NUMBER);\n"
-"+ char *s2 = MALLOC(A_NUMBER);\n"
-" if (!s2) {\n"
-" free(s1);\n"
-" return false;\n"
-msgstr ""
-
-msgid ""
"With this change, if the program gets compiled with the `-DFALLIBLE` flag "
"the fault-injection mechanism will run, and `MALLOC` will fail once for each"
" `filename`+`lineno` combination. When the flag is missing, `MALLOC` is a "
@@ -342,3 +323,41 @@ msgstr ""
msgid "Patches welcome!"
msgstr ""
+
+msgid ""
+"--- 3.c 2021-02-17 00:15:38.019706074 -0300\n"
+"+++ 4.c 2021-02-17 00:44:32.306885590 -0300\n"
+"@@ -1,11 +1,11 @@\n"
+" bool a_function() {\n"
+"- char *s1 = malloc(A_NUMBER);\n"
+"+ char *s1 = MALLOC(A_NUMBER);\n"
+" if (!s1) {\n"
+" return false;\n"
+" }\n"
+" strcpy(s1, \"some string\");\n"
+"\n"
+"- char *s2 = malloc(A_NUMBER);\n"
+"+ char *s2 = MALLOC(A_NUMBER);\n"
+" if (!s2) {\n"
+" free(s1);\n"
+" return false;\n"
+msgstr ""
+
+#~ msgid ""
+#~ "--- 3.c\t2021-02-17 00:15:38.019706074 -0300\n"
+#~ "+++ 4.c\t2021-02-17 00:44:32.306885590 -0300\n"
+#~ "@@ -1,11 +1,11 @@\n"
+#~ " bool a_function() {\n"
+#~ "- char *s1 = malloc(A_NUMBER);\n"
+#~ "+ char *s1 = MALLOC(A_NUMBER);\n"
+#~ " if (!s1) {\n"
+#~ " return false;\n"
+#~ " }\n"
+#~ " strcpy(s1, \"some string\");\n"
+#~ "\n"
+#~ "- char *s2 = malloc(A_NUMBER);\n"
+#~ "+ char *s2 = MALLOC(A_NUMBER);\n"
+#~ " if (!s2) {\n"
+#~ " free(s1);\n"
+#~ " return false;\n"
+#~ msgstr ""
diff --git a/locale/eo/LC_MESSAGES/_pastebins/2021-04-03-javascript-naive-slugify.po b/locale/eo/LC_MESSAGES/_pastebins/2021-04-03-javascript-naive-slugify.po
new file mode 100644
index 0000000..f6e087b
--- /dev/null
+++ b/locale/eo/LC_MESSAGES/_pastebins/2021-04-03-javascript-naive-slugify.po
@@ -0,0 +1,70 @@
+#
+msgid ""
+msgstr ""
+
+msgid "title: JavaScript naive slugify"
+msgstr ""
+
+msgid "date: 2021-04-03"
+msgstr ""
+
+msgid "layout: post"
+msgstr ""
+
+msgid "lang: en"
+msgstr ""
+
+msgid "ref: javascript-naive-slugify"
+msgstr ""
+
+msgid ""
+"const s = \"Pézão: açaí, saci-pererê.\";\n"
+"\n"
+"function slugify(s) {\n"
+" return s\n"
+" .toLowerCase()\n"
+" .replaceAll(\":\", \"\")\n"
+" .replaceAll(\".\", \"\")\n"
+" .replaceAll(\",\", \"\")\n"
+" .replaceAll(\"-\", \"\")\n"
+" .replaceAll(\"á\", \"a\")\n"
+" .replaceAll(\"ã\", \"a\")\n"
+" .replaceAll(\"à\", \"a\")\n"
+" .replaceAll(\"é\", \"e\")\n"
+" .replaceAll(\"ê\", \"e\")\n"
+" .replaceAll(\"í\", \"i\")\n"
+" .replaceAll(\"ó\", \"o\")\n"
+" .replaceAll(\"ô\", \"o\")\n"
+" .replaceAll(\"ú\", \"u\")\n"
+" .replaceAll(\"ü\", \"u\")\n"
+" .replaceAll(\"ç\", \"c\");\n"
+"}\n"
+"\n"
+"console.log(slugify(s));\n"
+msgstr ""
+
+#~ msgid ""
+#~ "const s = \"Pézão: açaí, saci-pererê.\";\n"
+#~ "\n"
+#~ "function slugify(s) {\n"
+#~ " return s\n"
+#~ " .toLowerCase()\n"
+#~ " .replaceAll(\":\", \"\")\n"
+#~ " .replaceAll(\".\", \"\")\n"
+#~ " .replaceAll(\",\", \"\")\n"
+#~ " .replaceAll(\"-\", \"\")\n"
+#~ " .replaceAll(\"á\", \"a\")\n"
+#~ " .replaceAll(\"ã\", \"a\")\n"
+#~ " .replaceAll(\"à\", \"a\")\n"
+#~ " .replaceAll(\"é\", \"e\")\n"
+#~ " .replaceAll(\"ê\", \"e\")\n"
+#~ " .replaceAll(\"í\", \"i\")\n"
+#~ " .replaceAll(\"ó\", \"o\")\n"
+#~ " .replaceAll(\"ô\", \"o\")\n"
+#~ " .replaceAll(\"ú\", \"u\")\n"
+#~ " .replaceAll(\"ü\", \"u\")\n"
+#~ " .replaceAll(\"ç\", \"c\");\n"
+#~ "}\n"
+#~ "\n"
+#~ "console.log(slugify(s));\n"
+#~ msgstr ""
diff --git a/locale/eo/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po b/locale/eo/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po
index badc41e..d0e9b44 100644
--- a/locale/eo/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po
+++ b/locale/eo/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po
@@ -57,14 +57,6 @@ msgid "It assumes that `$HOME/.local/bin` is in `$PATH`."
msgstr ""
msgid ""
-"This screencast is a simple demo of automating the installation of Alpine "
-"Linux 3.12.3 standard x86_64 with "
-"[AutoQEMU](https://git.euandreh.xyz/autoqemu/), which is nothing more "
-"than POSIX sh, [expect](https://core.tcl-lang.org/expect/index) scripts and "
-"Makefiles glued together."
-msgstr ""
-
-msgid ""
"pushd `mktemp -d`\n"
"git clone https://git.euandreh.xyz/autoqemu .\n"
"make\n"
@@ -72,6 +64,22 @@ msgid ""
"autoqemu ssh alpine\n"
msgstr ""
+msgid ""
+"This screencast is a simple demo of automating the installation of Alpine "
+"Linux 3.12.3 standard x86_64 with "
+"[AutoQEMU](https://git.euandreh.xyz/autoqemu/about), which is nothing more "
+"than POSIX sh, [expect](https://core.tcl-lang.org/expect/index) scripts and "
+"Makefiles glued together."
+msgstr ""
+
+#~ msgid ""
+#~ "This screencast is a simple demo of automating the installation of Alpine "
+#~ "Linux 3.12.3 standard x86_64 with "
+#~ "[AutoQEMU](https://git.euandreh.xyz/autoqemu/), which is nothing more than "
+#~ "POSIX sh, [expect](https://core.tcl-lang.org/expect/index) scripts and "
+#~ "Makefiles glued together."
+#~ msgstr ""
+
#~ msgid ""
#~ "pushd `mktemp -d`\n"
#~ "git clone https://git.euandreh.xyz/autoqemu .\n"
diff --git a/locale/eo/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po b/locale/eo/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po
index 421e295..6030e0c 100644
--- a/locale/eo/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po
+++ b/locale/eo/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po
@@ -49,9 +49,6 @@ msgid ""
"current staging area back to what it was before the checkout."
msgstr ""
-msgid "References:"
-msgstr ""
-
msgid ""
"[GIT: Checkout to a specific folder](https://stackoverflow.com/a/16493707) "
"(StackOverflow)"
@@ -107,6 +104,12 @@ msgstr ""
msgid "eu_categories: git"
msgstr ""
+msgid "References"
+msgstr ""
+
+#~ msgid "References:"
+#~ msgstr ""
+
#~ msgid ""
#~ "title: Browse a git repository at a specific commit\n"
#~ "date: 2020-08-14\n"
diff --git a/locale/eo/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po b/locale/eo/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po
index 182061b..1610cea 100644
--- a/locale/eo/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po
+++ b/locale/eo/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po
@@ -25,9 +25,9 @@ msgid ""
"The only difference is that you're working with only Git itself, so you're "
"not tied to any Git hosting provider: you can send pull requests across them"
" transparently! You could even use your own "
-"[cgit](https://git.zx2c4.com/cgit/) installation. No need to be locked"
-" in by any of them, putting the \"D\" back in \"DVCS\": it's a "
-"**distributed** version control system."
+"[cgit](https://git.zx2c4.com/cgit/) installation. No need to be locked in by"
+" any of them, putting the \"D\" back in \"DVCS\": it's a **distributed** "
+"version control system."
msgstr ""
msgid "`git request-pull` introduction"
diff --git a/locale/eo/LC_MESSAGES/_tils/2021-04-24-clojure-auto-curry.po b/locale/eo/LC_MESSAGES/_tils/2021-04-24-clojure-auto-curry.po
new file mode 100644
index 0000000..ab59a4f
--- /dev/null
+++ b/locale/eo/LC_MESSAGES/_tils/2021-04-24-clojure-auto-curry.po
@@ -0,0 +1,220 @@
+#
+msgid ""
+msgstr ""
+
+msgid "title: Clojure auto curry"
+msgstr ""
+
+msgid "layout: post"
+msgstr ""
+
+msgid "lang: en"
+msgstr ""
+
+msgid "ref: clojure-auto-curry"
+msgstr ""
+
+msgid "A naive `add` definition, alongside its usage and macroexpansion:"
+msgstr ""
+
+msgid ""
+"user=> (defcurry add\n"
+" [a b c d e]\n"
+" (+ 1 2 3 4 5))\n"
+"#'user/add\n"
+"\n"
+"user=> (add 1)\n"
+"#object[clojure.core$partial$fn__5857 0x2c708440 \"clojure.core$partial$fn__5857@2c708440\"]\n"
+"\n"
+"user=> (add 1 2 3 4)\n"
+"#object[clojure.core$partial$fn__5863 0xf4c0e4e \"clojure.core$partial$fn__5863@f4c0e4e\"]\n"
+"\n"
+"user=> ((add 1) 2 3 4 5)\n"
+"15\n"
+"\n"
+"user=> (((add 1) 2 3) 4 5)\n"
+"15\n"
+"\n"
+"user=> (use 'clojure.pprint)\n"
+"nil\n"
+"\n"
+"user=> (pprint\n"
+" (macroexpand\n"
+" '(defcurry add\n"
+" [a b c d e]\n"
+" (+ 1 2 3 4 5))))\n"
+"(def\n"
+" add\n"
+" (clojure.core/fn\n"
+" ([a b c d e] (+ 1 2 3 4 5))\n"
+" ([a] (clojure.core/partial add a))\n"
+" ([a b] (clojure.core/partial add a b))\n"
+" ([a b c] (clojure.core/partial add a b c))\n"
+" ([a b c d] (clojure.core/partial add a b c d))))\n"
+"nil\n"
+msgstr ""
+
+msgid ""
+"This simplistic `defcurry` definition doesn't support optional parameters, "
+"multi-arity, `&` rest arguments, docstrings, etc., but it could certainly "
+"evolve to do so."
+msgstr ""
+
+msgid ""
+"I like how `defcurry` is so short, and abdicates the responsability of doing"
+" the multi-arity logic to Clojure's built-in multi-arity support. Simple and"
+" elegant."
+msgstr ""
+
+msgid "Same Clojure as before, now with auto-currying via macros."
+msgstr ""
+
+msgid ""
+"Here's a simple macro defined by [Loretta "
+"He](http://lorettahe.github.io/clojure/2016/09/22/clojure-auto-curry) to "
+"create Clojure functions that are curried on all arguments, relying on "
+"Clojure's multi-arity support:"
+msgstr ""
+
+msgid "date: 2021-04-24 1"
+msgstr ""
+
+msgid ""
+"(defmacro defcurry\n"
+" [name args & body]\n"
+" (let [partials (map (fn [n]\n"
+" `(~(subvec args 0 n) (partial ~name ~@(take n args))))\n"
+" (range 1 (count args)))]\n"
+" `(defn ~name\n"
+" (~args ~@body)\n"
+" ~@partials)))\n"
+msgstr ""
+
+msgid "Comparison with Common Lisp"
+msgstr ""
+
+msgid "My attempt at writing an equivalent for Common Lisp gives me:"
+msgstr ""
+
+msgid ""
+"(defun partial (fn &rest args)\n"
+" (lambda (&rest args2)\n"
+" (apply fn (append args args2))))\n"
+"\n"
+"(defun curry-n (n func)\n"
+" (cond ((< n 0) (error \"Too many arguments\"))\n"
+" ((zerop n) (funcall func))\n"
+" (t (lambda (&rest rest)\n"
+" (curry-n (- n (length rest))\n"
+" (apply #'partial func rest))))))\n"
+"\n"
+"(defmacro defcurry (name args &body body)\n"
+" `(defun ,name (&rest rest)\n"
+" (let ((func (lambda ,args ,@body)))\n"
+" (curry-n (- ,(length args) (length rest))\n"
+" (apply #'partial func rest)))))\n"
+msgstr ""
+
+msgid ""
+"Without built-in multi-arity support, we have to do more work, like tracking"
+" the number of arguments consumed so far. We also have to write `#'partial` "
+"ourselves. That is, without dependending on any library, sticking to ANSI "
+"Common Lisp."
+msgstr ""
+
+msgid "The usage is pretty similar:"
+msgstr ""
+
+msgid ""
+"* (defcurry add (a b c d e)\n"
+" (+ a b c d e))\n"
+"ADD\n"
+"\n"
+"* (add 1)\n"
+"#<FUNCTION (LAMBDA (&REST REST) :IN CURRY-N) {100216419B}>\n"
+"\n"
+"* (funcall (add 1) 2 3 4)\n"
+"#<FUNCTION (LAMBDA (&REST REST) :IN CURRY-N) {100216537B}>\n"
+"\n"
+"* (funcall (add 1) 2 3 4 5)\n"
+"15\n"
+"\n"
+"* (funcall (funcall (add 1) 2 3) 4 5)\n"
+"15\n"
+"\n"
+"* (macroexpand-1\n"
+" '(defcurry add (a b c d e)\n"
+" (+ a b c d e)))\n"
+"(DEFUN ADD (&REST REST)\n"
+" (LET ((FUNC (LAMBDA (A B C D E) (+ A B C D E))))\n"
+" (CURRY-N (- 5 (LENGTH REST)) (APPLY #'PARTIAL FUNC REST))))\n"
+"T\n"
+msgstr ""
+
+msgid ""
+"This also require `funcall`s, since we return a `lambda` that doesn't live "
+"in the function namespace."
+msgstr ""
+
+msgid ""
+"Like the Clojure one, it doesn't support optional parameters, `&rest` rest "
+"arguments, docstrings, etc., but it also could evolve to do so."
+msgstr ""
+
+msgid "updated_at: 2021-04-27"
+msgstr ""
+
+#~ msgid ""
+#~ "(defmacro defcurry\n"
+#~ " [fname args & body]\n"
+#~ " (let [partials (map (fn [n]\n"
+#~ " `(~(subvec args 0 n) (partial ~fname ~@(take n args))))\n"
+#~ " (range 1 (count args)))]\n"
+#~ " `(defn ~fname\n"
+#~ " (~args ~@body)\n"
+#~ " ~@partials)))\n"
+#~ msgstr ""
+
+#~ msgid "date: 2021-04-24"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "A simple macro defined by [Loretta "
+#~ "He](http://lorettahe.github.io/clojure/2016/09/22/clojure-auto-curry) to "
+#~ "create Clojure functions that are curried on all arguments, relying on "
+#~ "Clojure's multi-arity support:"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Without built-in multi-arity support, we have to do more work, like tracking"
+#~ " the number of arguments consumed so far. That is, without dependending on "
+#~ "any library, sticking to ANSI Common Lisp."
+#~ msgstr ""
+
+#~ msgid ""
+#~ "(defun curry-n (n fn)\n"
+#~ " (if (= 0 n)\n"
+#~ " (funcall fn)\n"
+#~ " (lambda (&rest rest)\n"
+#~ " (curry-n (something n) fn))))\n"
+#~ "\n"
+#~ "(defun add (a b c d e)\n"
+#~ " (curry-n\n"
+#~ " (length '(a b c d e))\n"
+#~ " (lambda (&rest rest)\n"
+#~ " (apply #'+ rest))))\n"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "(defun curry-n (n fn)\n"
+#~ " (if (= 0 n)\n"
+#~ " (funcall fn)\n"
+#~ " (lambda (&rest rest)\n"
+#~ " (curry-n (something n) fn))))\n"
+#~ "\n"
+#~ "(defun add (a b c d e)\n"
+#~ " (curry-n\n"
+#~ " (length '(a b c d e))\n"
+#~ " (lambda (&rest rest)\n"
+#~ " (apply #'+ rest))))\n"
+#~ msgstr ""
diff --git a/locale/eo/LC_MESSAGES/_tils/2021-04-24-common-lisp-argument-precedence-order-parameterization-of-a-generic-function.po b/locale/eo/LC_MESSAGES/_tils/2021-04-24-common-lisp-argument-precedence-order-parameterization-of-a-generic-function.po
new file mode 100644
index 0000000..6aa66a8
--- /dev/null
+++ b/locale/eo/LC_MESSAGES/_tils/2021-04-24-common-lisp-argument-precedence-order-parameterization-of-a-generic-function.po
@@ -0,0 +1,210 @@
+#
+msgid ""
+msgstr ""
+
+msgid ""
+"title: Common Lisp argument precedence order parameterization of a generic "
+"function"
+msgstr ""
+
+msgid "layout: post"
+msgstr ""
+
+msgid "lang: en"
+msgstr ""
+
+msgid ""
+"ref: common-lisp-argument-precedence-order-parameterization-of-a-generic-"
+"function"
+msgstr ""
+
+msgid ""
+"When CLOS dispatches a method, it picks the most specific method definition "
+"to the argument list:"
+msgstr ""
+
+msgid ""
+"\n"
+"* (defgeneric a-fn (x))\n"
+"#<STANDARD-GENERIC-FUNCTION A-FN (0) {5815ACB9}>\n"
+"\n"
+"* (defmethod a-fn (x) :default-method)\n"
+"#<STANDARD-METHOD A-FN (T) {581DB535}>\n"
+"\n"
+"* (defmethod a-fn ((x number)) :a-number)\n"
+"#<STANDARD-METHOD A-FN (NUMBER) {58241645}>\n"
+"\n"
+"* (defmethod a-fn ((x (eql 1))) :number-1)\n"
+"#<STANDARD-METHOD A-FN ((EQL 1)) {582A7D75}>\n"
+"\n"
+"* (a-fn nil)\n"
+":DEFAULT-METHOD\n"
+"\n"
+"* (a-fn \"1\")\n"
+":DEFAULT-METHOD\n"
+"\n"
+"* (a-fn 0)\n"
+":A-NUMBER\n"
+"\n"
+"* (a-fn 1)\n"
+":NUMBER-1\n"
+msgstr ""
+
+msgid ""
+"CLOS uses a similar logic when choosing the method from parent classes, when"
+" multiple ones are available:"
+msgstr ""
+
+msgid ""
+"* (defclass class-a () ())\n"
+"\n"
+"#<STANDARD-CLASS CLASS-A {583E0B25}>\n"
+"* (defclass class-b () ())\n"
+"\n"
+"#<STANDARD-CLASS CLASS-B {583E7F6D}>\n"
+"* (defgeneric another-fn (obj))\n"
+"\n"
+"#<STANDARD-GENERIC-FUNCTION ANOTHER-FN (0) {583DA749}>\n"
+"* (defmethod another-fn ((obj class-a)) :class-a)\n"
+"; Compiling LAMBDA (.PV-CELL. .NEXT-METHOD-CALL. OBJ):\n"
+"; Compiling Top-Level Form:\n"
+"\n"
+"#<STANDARD-METHOD ANOTHER-FN (CLASS-A) {584523C5}>\n"
+"* (defmethod another-fn ((obj class-b)) :class-b)\n"
+"; Compiling LAMBDA (.PV-CELL. .NEXT-METHOD-CALL. OBJ):\n"
+"; Compiling Top-Level Form:\n"
+"\n"
+"#<STANDARD-METHOD ANOTHER-FN (CLASS-B) {584B8895}>\n"
+msgstr ""
+
+msgid ""
+"Given the above definitions, when inheriting from `class-a` and `class-b`, "
+"the order of inheritance matters:"
+msgstr ""
+
+msgid ""
+"* (defclass class-a-coming-first (class-a class-b) ())\n"
+"#<STANDARD-CLASS CLASS-A-COMING-FIRST {584BE6AD}>\n"
+"\n"
+"* (defclass class-b-coming-first (class-b class-a) ())\n"
+"#<STANDARD-CLASS CLASS-B-COMING-FIRST {584C744D}>\n"
+"\n"
+"* (another-fn (make-instance 'class-a-coming-first))\n"
+":CLASS-A\n"
+"\n"
+"* (another-fn (make-instance 'class-b-coming-first))\n"
+":CLASS-B\n"
+msgstr ""
+
+msgid ""
+"Combining the order of inheritance with generic functions with multiple "
+"arguments, CLOS has to make a choice of how to pick a method given two "
+"competing definitions, and its default strategy is prioritizing from left to"
+" right:"
+msgstr ""
+
+msgid ""
+"* (defgeneric yet-another-fn (obj1 obj2))\n"
+"#<STANDARD-GENERIC-FUNCTION YET-ANOTHER-FN (0) {584D9EC9}>\n"
+"\n"
+"* (defmethod yet-another-fn ((obj1 class-a) obj2) :first-arg-specialized)\n"
+"#<STANDARD-METHOD YET-ANOTHER-FN (CLASS-A T) {5854269D}>\n"
+"\n"
+"* (defmethod yet-another-fn (obj1 (obj2 class-b)) :second-arg-specialized)\n"
+"#<STANDARD-METHOD YET-ANOTHER-FN (T CLASS-B) {585AAAAD}>\n"
+"\n"
+"* (yet-another-fn (make-instance 'class-a) (make-instance 'class-b))\n"
+":FIRST-ARG-SPECIALIZED\n"
+msgstr ""
+
+msgid ""
+"For that, we use the `:argument-precedence-order` option when declaring a "
+"generic function:"
+msgstr ""
+
+msgid ""
+"* (defgeneric yet-another-fn (obj1 obj2) (:argument-precedence-order obj2 obj1))\n"
+"#<STANDARD-GENERIC-FUNCTION YET-ANOTHER-FN (2) {584D9EC9}>\n"
+"\n"
+"* (yet-another-fn (make-instance 'class-a) (make-instance 'class-b))\n"
+":SECOND-ARG-SPECIALIZED\n"
+msgstr ""
+
+msgid ""
+"I liked that the `:argument-precedence-order` option exists. We shouldn't "
+"have to change the arguments from `(obj1 obj2)` to `(obj2 obj1)` just to "
+"make CLOS pick the method that we want. We can configure its default "
+"behaviour if desired, and keep the order of arguments however it best fits "
+"the generic function."
+msgstr ""
+
+msgid "Comparison with Clojure"
+msgstr ""
+
+msgid "Clojure has an equivalent, when using `defmulti`."
+msgstr ""
+
+msgid ""
+"Since when declaring a multi-method with `defmulti` we must define the "
+"dispatch function, Clojure uses it to pick the method definition. Since the "
+"dispatch function is required, there is no need for a default behaviour, "
+"such as left-to-right."
+msgstr ""
+
+msgid "Conclusion"
+msgstr ""
+
+msgid ""
+"Making the argument precedence order configurable for generic functions but "
+"not for class definitions makes a lot of sense."
+msgstr ""
+
+msgid ""
+"One shouldn't change the order of arguments of a generic function for the "
+"sake of tailoring it to the CLOS priority ranking algorithm, but doing it "
+"for a class definition is just fine."
+msgstr ""
+
+msgid "TIL."
+msgstr ""
+
+msgid ""
+"CLOS has to make a choice between the first and the second definition of "
+"`yet-another-fn`, but its choice is just a heuristic. What if we want the "
+"choice to be based on the second argument, instead of the first?"
+msgstr ""
+
+msgid ""
+"When declaring a class, we can choose the precedence order, and that is "
+"about it. But when defining a generic function, the order of arguments is "
+"more important to the function semantics, and the argument precedence being "
+"left-to-right is just the default behaviour."
+msgstr ""
+
+msgid "References"
+msgstr ""
+
+msgid ""
+"[Object-Oriented Programming in Common Lisp: A Programmer's Guide to "
+"CLOS](https://en.wikipedia.org/wiki/Object-"
+"Oriented_Programming_in_Common_Lisp), by Sonja E. Keene"
+msgstr ""
+
+msgid "date: 2021-04-24 2"
+msgstr ""
+
+#~ msgid "date: 2021-04-24"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "CLOS has to make a choice between the first and the second definition of "
+#~ "`yet-another-fn`, but its choice is just a heuristic. What if we want to the"
+#~ " choice to be based on the second argument first?"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "When declaring a class, we can choose the precedence order, and that is "
+#~ "about it. But when defining a generic function, the order of argumentws is "
+#~ "more important to the function semantics, and the argument precedence being "
+#~ "left-to-right is just the default behaviour."
+#~ msgstr ""
diff --git a/locale/eo/LC_MESSAGES/_tils/2021-04-24-three-way-conditional-for-number-signs.po b/locale/eo/LC_MESSAGES/_tils/2021-04-24-three-way-conditional-for-number-signs.po
new file mode 100644
index 0000000..925a00b
--- /dev/null
+++ b/locale/eo/LC_MESSAGES/_tils/2021-04-24-three-way-conditional-for-number-signs.po
@@ -0,0 +1,95 @@
+#
+msgid ""
+msgstr ""
+
+msgid "title: Three-way conditional for number signs"
+msgstr ""
+
+msgid "date: 2021-04-24 3"
+msgstr ""
+
+msgid "layout: post"
+msgstr ""
+
+msgid "lang: en"
+msgstr ""
+
+msgid "ref: three-way-conditional-for-number-signs"
+msgstr ""
+
+msgid ""
+"A useful macro from Paul Graham's [On "
+"Lisp](http://www.paulgraham.com/onlisptext.html) book:"
+msgstr ""
+
+msgid ""
+"(defmacro nif (expr pos zero neg)\n"
+" (let ((g (gensym)))\n"
+" `(let ((,g ,expr))\n"
+" (cond ((plusp ,g) ,pos)\n"
+" ((zerop ,g) ,zero)\n"
+" (t ,neg)))))\n"
+msgstr ""
+
+msgid ""
+"The latest example I can think of is section 1.3.3 of [Structure and "
+"Interpretation of Computer "
+"Programs](https://mitpress.mit.edu/sites/default/files/sicp/index.html), "
+"which I was reading recently:"
+msgstr ""
+
+msgid ""
+"(define (search f neg-point pos-point)\n"
+" (let ((midpoint (average neg-point pos-point)))\n"
+" (if (close-enough? neg-point post-point)\n"
+" midpoint\n"
+" (let ((test-value (f midpoint)))\n"
+" (cond ((positive? test-value)\n"
+" (search f neg-point midpoint))\n"
+" ((negative? test-value)\n"
+" (search f midpoint pos-point))\n"
+" (else midpoint))))))\n"
+msgstr ""
+
+msgid ""
+"(define (search f neg-point pos-point)\n"
+" (let ((midpoint (average neg-point pos-point)))\n"
+" (if (close-enough? neg-point post-point)\n"
+" midpoint\n"
+" (nif (f midpoint)\n"
+" (search f neg-point midpoint)\n"
+" (midpoint)\n"
+" (search f midpoint pos-point)))))\n"
+msgstr ""
+
+msgid ""
+"It also avoids `cond`'s extra clunky parentheses for grouping, which is "
+"unnecessary but built-in."
+msgstr ""
+
+msgid ""
+"As a macro, I personally feel it tilts the balance towards expressivenes "
+"despite its extra cognitive load toll."
+msgstr ""
+
+msgid ""
+"After I looked at this macro, I started seeing opportunities to using it in "
+"many places, and yet I didn't see anyone else using it."
+msgstr ""
+
+msgid ""
+"Not that the book should introduce such macro this early, but I couldn't "
+"avoid feeling bothered by not using the `nif` macro, which could even remove"
+" the need for the intermediate `test-value` variable:"
+msgstr ""
+
+#~ msgid ""
+#~ "After I looked at this macro, I started seeing opportunities to using it in "
+#~ "many places, and yet I didn't see anyonelse using it."
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Not that the book should introduce such macro this early, but I couldn't "
+#~ "avoid feeling bothered by not using a `nif` macro, which could even remove "
+#~ "the need for the intermediate `test-value` variable:"
+#~ msgstr ""
diff --git a/locale/fr/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po b/locale/fr/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po
index 86c8389..3c7e6ec 100644
--- a/locale/fr/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po
+++ b/locale/fr/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po
@@ -12,8 +12,8 @@ msgstr ""
msgid ""
"I wrote a simple little tool called "
-"[swift2nix](https://git.euandreh.xyz/swift2nix/) that allows you trick"
-" Swift's package manager into assuming everything is set up. Here's the "
+"[swift2nix](https://git.euandreh.xyz/swift2nix/) that allows you trick "
+"Swift's package manager into assuming everything is set up. Here's the "
"example from swift2nix's README file:"
msgstr ""
diff --git a/locale/fr/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po b/locale/fr/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po
index 0e0bc8c..ecd28a5 100644
--- a/locale/fr/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po
+++ b/locale/fr/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po
@@ -381,18 +381,18 @@ msgstr ""
#~ msgid ""
#~ "I've started a fork of cbindgen: "
-#~ "[x-bindgen](https://git.euandreh.xyz/x-bindgen/). Right now it is just "
-#~ "a copy of cbindgen verbatim, and I plan to remove all C and C++ emitting "
-#~ "code from it, and add a IR emitting code instead."
+#~ "[x-bindgen](https://git.euandreh.xyz/x-bindgen/). Right now it is just a "
+#~ "copy of cbindgen verbatim, and I plan to remove all C and C++ emitting code "
+#~ "from it, and add a IR emitting code instead."
#~ msgstr ""
#~ msgid ""
#~ "When starting working on x-bindgen, I realized I didn't know what to look "
#~ "for in a header file, as I haven't written any C code in many years. So as I"
-#~ " was writing [libedn](https://git.euandreh.xyz/libedn/), I didn't know "
-#~ "how to build a good C API to expose. So I tried porting the code to C, and "
-#~ "right now I'm working on building a *good* C API for a JSON parser using "
-#~ "parser combinators: [ParsecC](https://git.euandreh.xyz/parsecc/)."
+#~ " was writing [libedn](https://git.euandreh.xyz/libedn/), I didn't know how "
+#~ "to build a good C API to expose. So I tried porting the code to C, and right"
+#~ " now I'm working on building a *good* C API for a JSON parser using parser "
+#~ "combinators: [ParsecC](https://git.euandreh.xyz/parsecc/)."
#~ msgstr ""
#~ msgid ""
diff --git a/locale/fr/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po b/locale/fr/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po
index a7e3382..c85754b 100644
--- a/locale/fr/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po
+++ b/locale/fr/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po
@@ -269,9 +269,9 @@ msgstr ""
msgid ""
"For my personal use, I've [packaged](https://git.euandreh.xyz/package-"
-"repository/) `remembering` for GNU Guix and Nix. Packaging it to any "
-"other distribution should be trivial, or just downloading the tarball and "
-"running `[sudo] make install`."
+"repository/) `remembering` for GNU Guix and Nix. Packaging it to any other "
+"distribution should be trivial, or just downloading the tarball and running "
+"`[sudo] make install`."
msgstr ""
#~ msgid ""
@@ -288,8 +288,8 @@ msgstr ""
#~ msgid ""
#~ "Today I pushed v0.1.0 of "
-#~ "[remembering](https://git.euandreh.xyz/remembering/), a tool to "
-#~ "enhance the interactive usability of menu-like tools, such as "
+#~ "[remembering](https://git.euandreh.xyz/remembering/), a tool to enhance the "
+#~ "interactive usability of menu-like tools, such as "
#~ "[dmenu](https://tools.suckless.org/dmenu/) and "
#~ "[fzf](https://github.com/junegunn/fzf)."
#~ msgstr ""
diff --git a/locale/fr/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po b/locale/fr/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po
index 442e6d0..e30c889 100644
--- a/locale/fr/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po
+++ b/locale/fr/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po
@@ -241,25 +241,6 @@ msgid ""
msgstr ""
msgid ""
-"--- 3.c\t2021-02-17 00:15:38.019706074 -0300\n"
-"+++ 4.c\t2021-02-17 00:44:32.306885590 -0300\n"
-"@@ -1,11 +1,11 @@\n"
-" bool a_function() {\n"
-"- char *s1 = malloc(A_NUMBER);\n"
-"+ char *s1 = MALLOC(A_NUMBER);\n"
-" if (!s1) {\n"
-" return false;\n"
-" }\n"
-" strcpy(s1, \"some string\");\n"
-"\n"
-"- char *s2 = malloc(A_NUMBER);\n"
-"+ char *s2 = MALLOC(A_NUMBER);\n"
-" if (!s2) {\n"
-" free(s1);\n"
-" return false;\n"
-msgstr ""
-
-msgid ""
"With this change, if the program gets compiled with the `-DFALLIBLE` flag "
"the fault-injection mechanism will run, and `MALLOC` will fail once for each"
" `filename`+`lineno` combination. When the flag is missing, `MALLOC` is a "
@@ -342,3 +323,41 @@ msgstr ""
msgid "Patches welcome!"
msgstr ""
+
+msgid ""
+"--- 3.c 2021-02-17 00:15:38.019706074 -0300\n"
+"+++ 4.c 2021-02-17 00:44:32.306885590 -0300\n"
+"@@ -1,11 +1,11 @@\n"
+" bool a_function() {\n"
+"- char *s1 = malloc(A_NUMBER);\n"
+"+ char *s1 = MALLOC(A_NUMBER);\n"
+" if (!s1) {\n"
+" return false;\n"
+" }\n"
+" strcpy(s1, \"some string\");\n"
+"\n"
+"- char *s2 = malloc(A_NUMBER);\n"
+"+ char *s2 = MALLOC(A_NUMBER);\n"
+" if (!s2) {\n"
+" free(s1);\n"
+" return false;\n"
+msgstr ""
+
+#~ msgid ""
+#~ "--- 3.c\t2021-02-17 00:15:38.019706074 -0300\n"
+#~ "+++ 4.c\t2021-02-17 00:44:32.306885590 -0300\n"
+#~ "@@ -1,11 +1,11 @@\n"
+#~ " bool a_function() {\n"
+#~ "- char *s1 = malloc(A_NUMBER);\n"
+#~ "+ char *s1 = MALLOC(A_NUMBER);\n"
+#~ " if (!s1) {\n"
+#~ " return false;\n"
+#~ " }\n"
+#~ " strcpy(s1, \"some string\");\n"
+#~ "\n"
+#~ "- char *s2 = malloc(A_NUMBER);\n"
+#~ "+ char *s2 = MALLOC(A_NUMBER);\n"
+#~ " if (!s2) {\n"
+#~ " free(s1);\n"
+#~ " return false;\n"
+#~ msgstr ""
diff --git a/locale/fr/LC_MESSAGES/_pastebins/2021-04-03-javascript-naive-slugify.po b/locale/fr/LC_MESSAGES/_pastebins/2021-04-03-javascript-naive-slugify.po
new file mode 100644
index 0000000..f6e087b
--- /dev/null
+++ b/locale/fr/LC_MESSAGES/_pastebins/2021-04-03-javascript-naive-slugify.po
@@ -0,0 +1,70 @@
+#
+msgid ""
+msgstr ""
+
+msgid "title: JavaScript naive slugify"
+msgstr ""
+
+msgid "date: 2021-04-03"
+msgstr ""
+
+msgid "layout: post"
+msgstr ""
+
+msgid "lang: en"
+msgstr ""
+
+msgid "ref: javascript-naive-slugify"
+msgstr ""
+
+msgid ""
+"const s = \"Pézão: açaí, saci-pererê.\";\n"
+"\n"
+"function slugify(s) {\n"
+" return s\n"
+" .toLowerCase()\n"
+" .replaceAll(\":\", \"\")\n"
+" .replaceAll(\".\", \"\")\n"
+" .replaceAll(\",\", \"\")\n"
+" .replaceAll(\"-\", \"\")\n"
+" .replaceAll(\"á\", \"a\")\n"
+" .replaceAll(\"ã\", \"a\")\n"
+" .replaceAll(\"à\", \"a\")\n"
+" .replaceAll(\"é\", \"e\")\n"
+" .replaceAll(\"ê\", \"e\")\n"
+" .replaceAll(\"í\", \"i\")\n"
+" .replaceAll(\"ó\", \"o\")\n"
+" .replaceAll(\"ô\", \"o\")\n"
+" .replaceAll(\"ú\", \"u\")\n"
+" .replaceAll(\"ü\", \"u\")\n"
+" .replaceAll(\"ç\", \"c\");\n"
+"}\n"
+"\n"
+"console.log(slugify(s));\n"
+msgstr ""
+
+#~ msgid ""
+#~ "const s = \"Pézão: açaí, saci-pererê.\";\n"
+#~ "\n"
+#~ "function slugify(s) {\n"
+#~ " return s\n"
+#~ " .toLowerCase()\n"
+#~ " .replaceAll(\":\", \"\")\n"
+#~ " .replaceAll(\".\", \"\")\n"
+#~ " .replaceAll(\",\", \"\")\n"
+#~ " .replaceAll(\"-\", \"\")\n"
+#~ " .replaceAll(\"á\", \"a\")\n"
+#~ " .replaceAll(\"ã\", \"a\")\n"
+#~ " .replaceAll(\"à\", \"a\")\n"
+#~ " .replaceAll(\"é\", \"e\")\n"
+#~ " .replaceAll(\"ê\", \"e\")\n"
+#~ " .replaceAll(\"í\", \"i\")\n"
+#~ " .replaceAll(\"ó\", \"o\")\n"
+#~ " .replaceAll(\"ô\", \"o\")\n"
+#~ " .replaceAll(\"ú\", \"u\")\n"
+#~ " .replaceAll(\"ü\", \"u\")\n"
+#~ " .replaceAll(\"ç\", \"c\");\n"
+#~ "}\n"
+#~ "\n"
+#~ "console.log(slugify(s));\n"
+#~ msgstr ""
diff --git a/locale/fr/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po b/locale/fr/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po
index badc41e..d0e9b44 100644
--- a/locale/fr/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po
+++ b/locale/fr/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po
@@ -57,14 +57,6 @@ msgid "It assumes that `$HOME/.local/bin` is in `$PATH`."
msgstr ""
msgid ""
-"This screencast is a simple demo of automating the installation of Alpine "
-"Linux 3.12.3 standard x86_64 with "
-"[AutoQEMU](https://git.euandreh.xyz/autoqemu/), which is nothing more "
-"than POSIX sh, [expect](https://core.tcl-lang.org/expect/index) scripts and "
-"Makefiles glued together."
-msgstr ""
-
-msgid ""
"pushd `mktemp -d`\n"
"git clone https://git.euandreh.xyz/autoqemu .\n"
"make\n"
@@ -72,6 +64,22 @@ msgid ""
"autoqemu ssh alpine\n"
msgstr ""
+msgid ""
+"This screencast is a simple demo of automating the installation of Alpine "
+"Linux 3.12.3 standard x86_64 with "
+"[AutoQEMU](https://git.euandreh.xyz/autoqemu/about), which is nothing more "
+"than POSIX sh, [expect](https://core.tcl-lang.org/expect/index) scripts and "
+"Makefiles glued together."
+msgstr ""
+
+#~ msgid ""
+#~ "This screencast is a simple demo of automating the installation of Alpine "
+#~ "Linux 3.12.3 standard x86_64 with "
+#~ "[AutoQEMU](https://git.euandreh.xyz/autoqemu/), which is nothing more than "
+#~ "POSIX sh, [expect](https://core.tcl-lang.org/expect/index) scripts and "
+#~ "Makefiles glued together."
+#~ msgstr ""
+
#~ msgid ""
#~ "pushd `mktemp -d`\n"
#~ "git clone https://git.euandreh.xyz/autoqemu .\n"
diff --git a/locale/fr/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po b/locale/fr/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po
index 421e295..6030e0c 100644
--- a/locale/fr/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po
+++ b/locale/fr/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po
@@ -49,9 +49,6 @@ msgid ""
"current staging area back to what it was before the checkout."
msgstr ""
-msgid "References:"
-msgstr ""
-
msgid ""
"[GIT: Checkout to a specific folder](https://stackoverflow.com/a/16493707) "
"(StackOverflow)"
@@ -107,6 +104,12 @@ msgstr ""
msgid "eu_categories: git"
msgstr ""
+msgid "References"
+msgstr ""
+
+#~ msgid "References:"
+#~ msgstr ""
+
#~ msgid ""
#~ "title: Browse a git repository at a specific commit\n"
#~ "date: 2020-08-14\n"
diff --git a/locale/fr/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po b/locale/fr/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po
index 182061b..1610cea 100644
--- a/locale/fr/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po
+++ b/locale/fr/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po
@@ -25,9 +25,9 @@ msgid ""
"The only difference is that you're working with only Git itself, so you're "
"not tied to any Git hosting provider: you can send pull requests across them"
" transparently! You could even use your own "
-"[cgit](https://git.zx2c4.com/cgit/) installation. No need to be locked"
-" in by any of them, putting the \"D\" back in \"DVCS\": it's a "
-"**distributed** version control system."
+"[cgit](https://git.zx2c4.com/cgit/) installation. No need to be locked in by"
+" any of them, putting the \"D\" back in \"DVCS\": it's a **distributed** "
+"version control system."
msgstr ""
msgid "`git request-pull` introduction"
diff --git a/locale/fr/LC_MESSAGES/_tils/2021-04-24-clojure-auto-curry.po b/locale/fr/LC_MESSAGES/_tils/2021-04-24-clojure-auto-curry.po
new file mode 100644
index 0000000..ab59a4f
--- /dev/null
+++ b/locale/fr/LC_MESSAGES/_tils/2021-04-24-clojure-auto-curry.po
@@ -0,0 +1,220 @@
+#
+msgid ""
+msgstr ""
+
+msgid "title: Clojure auto curry"
+msgstr ""
+
+msgid "layout: post"
+msgstr ""
+
+msgid "lang: en"
+msgstr ""
+
+msgid "ref: clojure-auto-curry"
+msgstr ""
+
+msgid "A naive `add` definition, alongside its usage and macroexpansion:"
+msgstr ""
+
+msgid ""
+"user=> (defcurry add\n"
+" [a b c d e]\n"
+" (+ 1 2 3 4 5))\n"
+"#'user/add\n"
+"\n"
+"user=> (add 1)\n"
+"#object[clojure.core$partial$fn__5857 0x2c708440 \"clojure.core$partial$fn__5857@2c708440\"]\n"
+"\n"
+"user=> (add 1 2 3 4)\n"
+"#object[clojure.core$partial$fn__5863 0xf4c0e4e \"clojure.core$partial$fn__5863@f4c0e4e\"]\n"
+"\n"
+"user=> ((add 1) 2 3 4 5)\n"
+"15\n"
+"\n"
+"user=> (((add 1) 2 3) 4 5)\n"
+"15\n"
+"\n"
+"user=> (use 'clojure.pprint)\n"
+"nil\n"
+"\n"
+"user=> (pprint\n"
+" (macroexpand\n"
+" '(defcurry add\n"
+" [a b c d e]\n"
+" (+ 1 2 3 4 5))))\n"
+"(def\n"
+" add\n"
+" (clojure.core/fn\n"
+" ([a b c d e] (+ 1 2 3 4 5))\n"
+" ([a] (clojure.core/partial add a))\n"
+" ([a b] (clojure.core/partial add a b))\n"
+" ([a b c] (clojure.core/partial add a b c))\n"
+" ([a b c d] (clojure.core/partial add a b c d))))\n"
+"nil\n"
+msgstr ""
+
+msgid ""
+"This simplistic `defcurry` definition doesn't support optional parameters, "
+"multi-arity, `&` rest arguments, docstrings, etc., but it could certainly "
+"evolve to do so."
+msgstr ""
+
+msgid ""
+"I like how `defcurry` is so short, and abdicates the responsability of doing"
+" the multi-arity logic to Clojure's built-in multi-arity support. Simple and"
+" elegant."
+msgstr ""
+
+msgid "Same Clojure as before, now with auto-currying via macros."
+msgstr ""
+
+msgid ""
+"Here's a simple macro defined by [Loretta "
+"He](http://lorettahe.github.io/clojure/2016/09/22/clojure-auto-curry) to "
+"create Clojure functions that are curried on all arguments, relying on "
+"Clojure's multi-arity support:"
+msgstr ""
+
+msgid "date: 2021-04-24 1"
+msgstr ""
+
+msgid ""
+"(defmacro defcurry\n"
+" [name args & body]\n"
+" (let [partials (map (fn [n]\n"
+" `(~(subvec args 0 n) (partial ~name ~@(take n args))))\n"
+" (range 1 (count args)))]\n"
+" `(defn ~name\n"
+" (~args ~@body)\n"
+" ~@partials)))\n"
+msgstr ""
+
+msgid "Comparison with Common Lisp"
+msgstr ""
+
+msgid "My attempt at writing an equivalent for Common Lisp gives me:"
+msgstr ""
+
+msgid ""
+"(defun partial (fn &rest args)\n"
+" (lambda (&rest args2)\n"
+" (apply fn (append args args2))))\n"
+"\n"
+"(defun curry-n (n func)\n"
+" (cond ((< n 0) (error \"Too many arguments\"))\n"
+" ((zerop n) (funcall func))\n"
+" (t (lambda (&rest rest)\n"
+" (curry-n (- n (length rest))\n"
+" (apply #'partial func rest))))))\n"
+"\n"
+"(defmacro defcurry (name args &body body)\n"
+" `(defun ,name (&rest rest)\n"
+" (let ((func (lambda ,args ,@body)))\n"
+" (curry-n (- ,(length args) (length rest))\n"
+" (apply #'partial func rest)))))\n"
+msgstr ""
+
+msgid ""
+"Without built-in multi-arity support, we have to do more work, like tracking"
+" the number of arguments consumed so far. We also have to write `#'partial` "
+"ourselves. That is, without dependending on any library, sticking to ANSI "
+"Common Lisp."
+msgstr ""
+
+msgid "The usage is pretty similar:"
+msgstr ""
+
+msgid ""
+"* (defcurry add (a b c d e)\n"
+" (+ a b c d e))\n"
+"ADD\n"
+"\n"
+"* (add 1)\n"
+"#<FUNCTION (LAMBDA (&REST REST) :IN CURRY-N) {100216419B}>\n"
+"\n"
+"* (funcall (add 1) 2 3 4)\n"
+"#<FUNCTION (LAMBDA (&REST REST) :IN CURRY-N) {100216537B}>\n"
+"\n"
+"* (funcall (add 1) 2 3 4 5)\n"
+"15\n"
+"\n"
+"* (funcall (funcall (add 1) 2 3) 4 5)\n"
+"15\n"
+"\n"
+"* (macroexpand-1\n"
+" '(defcurry add (a b c d e)\n"
+" (+ a b c d e)))\n"
+"(DEFUN ADD (&REST REST)\n"
+" (LET ((FUNC (LAMBDA (A B C D E) (+ A B C D E))))\n"
+" (CURRY-N (- 5 (LENGTH REST)) (APPLY #'PARTIAL FUNC REST))))\n"
+"T\n"
+msgstr ""
+
+msgid ""
+"This also require `funcall`s, since we return a `lambda` that doesn't live "
+"in the function namespace."
+msgstr ""
+
+msgid ""
+"Like the Clojure one, it doesn't support optional parameters, `&rest` rest "
+"arguments, docstrings, etc., but it also could evolve to do so."
+msgstr ""
+
+msgid "updated_at: 2021-04-27"
+msgstr ""
+
+#~ msgid ""
+#~ "(defmacro defcurry\n"
+#~ " [fname args & body]\n"
+#~ " (let [partials (map (fn [n]\n"
+#~ " `(~(subvec args 0 n) (partial ~fname ~@(take n args))))\n"
+#~ " (range 1 (count args)))]\n"
+#~ " `(defn ~fname\n"
+#~ " (~args ~@body)\n"
+#~ " ~@partials)))\n"
+#~ msgstr ""
+
+#~ msgid "date: 2021-04-24"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "A simple macro defined by [Loretta "
+#~ "He](http://lorettahe.github.io/clojure/2016/09/22/clojure-auto-curry) to "
+#~ "create Clojure functions that are curried on all arguments, relying on "
+#~ "Clojure's multi-arity support:"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Without built-in multi-arity support, we have to do more work, like tracking"
+#~ " the number of arguments consumed so far. That is, without dependending on "
+#~ "any library, sticking to ANSI Common Lisp."
+#~ msgstr ""
+
+#~ msgid ""
+#~ "(defun curry-n (n fn)\n"
+#~ " (if (= 0 n)\n"
+#~ " (funcall fn)\n"
+#~ " (lambda (&rest rest)\n"
+#~ " (curry-n (something n) fn))))\n"
+#~ "\n"
+#~ "(defun add (a b c d e)\n"
+#~ " (curry-n\n"
+#~ " (length '(a b c d e))\n"
+#~ " (lambda (&rest rest)\n"
+#~ " (apply #'+ rest))))\n"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "(defun curry-n (n fn)\n"
+#~ " (if (= 0 n)\n"
+#~ " (funcall fn)\n"
+#~ " (lambda (&rest rest)\n"
+#~ " (curry-n (something n) fn))))\n"
+#~ "\n"
+#~ "(defun add (a b c d e)\n"
+#~ " (curry-n\n"
+#~ " (length '(a b c d e))\n"
+#~ " (lambda (&rest rest)\n"
+#~ " (apply #'+ rest))))\n"
+#~ msgstr ""
diff --git a/locale/fr/LC_MESSAGES/_tils/2021-04-24-common-lisp-argument-precedence-order-parameterization-of-a-generic-function.po b/locale/fr/LC_MESSAGES/_tils/2021-04-24-common-lisp-argument-precedence-order-parameterization-of-a-generic-function.po
new file mode 100644
index 0000000..6aa66a8
--- /dev/null
+++ b/locale/fr/LC_MESSAGES/_tils/2021-04-24-common-lisp-argument-precedence-order-parameterization-of-a-generic-function.po
@@ -0,0 +1,210 @@
+#
+msgid ""
+msgstr ""
+
+msgid ""
+"title: Common Lisp argument precedence order parameterization of a generic "
+"function"
+msgstr ""
+
+msgid "layout: post"
+msgstr ""
+
+msgid "lang: en"
+msgstr ""
+
+msgid ""
+"ref: common-lisp-argument-precedence-order-parameterization-of-a-generic-"
+"function"
+msgstr ""
+
+msgid ""
+"When CLOS dispatches a method, it picks the most specific method definition "
+"to the argument list:"
+msgstr ""
+
+msgid ""
+"\n"
+"* (defgeneric a-fn (x))\n"
+"#<STANDARD-GENERIC-FUNCTION A-FN (0) {5815ACB9}>\n"
+"\n"
+"* (defmethod a-fn (x) :default-method)\n"
+"#<STANDARD-METHOD A-FN (T) {581DB535}>\n"
+"\n"
+"* (defmethod a-fn ((x number)) :a-number)\n"
+"#<STANDARD-METHOD A-FN (NUMBER) {58241645}>\n"
+"\n"
+"* (defmethod a-fn ((x (eql 1))) :number-1)\n"
+"#<STANDARD-METHOD A-FN ((EQL 1)) {582A7D75}>\n"
+"\n"
+"* (a-fn nil)\n"
+":DEFAULT-METHOD\n"
+"\n"
+"* (a-fn \"1\")\n"
+":DEFAULT-METHOD\n"
+"\n"
+"* (a-fn 0)\n"
+":A-NUMBER\n"
+"\n"
+"* (a-fn 1)\n"
+":NUMBER-1\n"
+msgstr ""
+
+msgid ""
+"CLOS uses a similar logic when choosing the method from parent classes, when"
+" multiple ones are available:"
+msgstr ""
+
+msgid ""
+"* (defclass class-a () ())\n"
+"\n"
+"#<STANDARD-CLASS CLASS-A {583E0B25}>\n"
+"* (defclass class-b () ())\n"
+"\n"
+"#<STANDARD-CLASS CLASS-B {583E7F6D}>\n"
+"* (defgeneric another-fn (obj))\n"
+"\n"
+"#<STANDARD-GENERIC-FUNCTION ANOTHER-FN (0) {583DA749}>\n"
+"* (defmethod another-fn ((obj class-a)) :class-a)\n"
+"; Compiling LAMBDA (.PV-CELL. .NEXT-METHOD-CALL. OBJ):\n"
+"; Compiling Top-Level Form:\n"
+"\n"
+"#<STANDARD-METHOD ANOTHER-FN (CLASS-A) {584523C5}>\n"
+"* (defmethod another-fn ((obj class-b)) :class-b)\n"
+"; Compiling LAMBDA (.PV-CELL. .NEXT-METHOD-CALL. OBJ):\n"
+"; Compiling Top-Level Form:\n"
+"\n"
+"#<STANDARD-METHOD ANOTHER-FN (CLASS-B) {584B8895}>\n"
+msgstr ""
+
+msgid ""
+"Given the above definitions, when inheriting from `class-a` and `class-b`, "
+"the order of inheritance matters:"
+msgstr ""
+
+msgid ""
+"* (defclass class-a-coming-first (class-a class-b) ())\n"
+"#<STANDARD-CLASS CLASS-A-COMING-FIRST {584BE6AD}>\n"
+"\n"
+"* (defclass class-b-coming-first (class-b class-a) ())\n"
+"#<STANDARD-CLASS CLASS-B-COMING-FIRST {584C744D}>\n"
+"\n"
+"* (another-fn (make-instance 'class-a-coming-first))\n"
+":CLASS-A\n"
+"\n"
+"* (another-fn (make-instance 'class-b-coming-first))\n"
+":CLASS-B\n"
+msgstr ""
+
+msgid ""
+"Combining the order of inheritance with generic functions with multiple "
+"arguments, CLOS has to make a choice of how to pick a method given two "
+"competing definitions, and its default strategy is prioritizing from left to"
+" right:"
+msgstr ""
+
+msgid ""
+"* (defgeneric yet-another-fn (obj1 obj2))\n"
+"#<STANDARD-GENERIC-FUNCTION YET-ANOTHER-FN (0) {584D9EC9}>\n"
+"\n"
+"* (defmethod yet-another-fn ((obj1 class-a) obj2) :first-arg-specialized)\n"
+"#<STANDARD-METHOD YET-ANOTHER-FN (CLASS-A T) {5854269D}>\n"
+"\n"
+"* (defmethod yet-another-fn (obj1 (obj2 class-b)) :second-arg-specialized)\n"
+"#<STANDARD-METHOD YET-ANOTHER-FN (T CLASS-B) {585AAAAD}>\n"
+"\n"
+"* (yet-another-fn (make-instance 'class-a) (make-instance 'class-b))\n"
+":FIRST-ARG-SPECIALIZED\n"
+msgstr ""
+
+msgid ""
+"For that, we use the `:argument-precedence-order` option when declaring a "
+"generic function:"
+msgstr ""
+
+msgid ""
+"* (defgeneric yet-another-fn (obj1 obj2) (:argument-precedence-order obj2 obj1))\n"
+"#<STANDARD-GENERIC-FUNCTION YET-ANOTHER-FN (2) {584D9EC9}>\n"
+"\n"
+"* (yet-another-fn (make-instance 'class-a) (make-instance 'class-b))\n"
+":SECOND-ARG-SPECIALIZED\n"
+msgstr ""
+
+msgid ""
+"I liked that the `:argument-precedence-order` option exists. We shouldn't "
+"have to change the arguments from `(obj1 obj2)` to `(obj2 obj1)` just to "
+"make CLOS pick the method that we want. We can configure its default "
+"behaviour if desired, and keep the order of arguments however it best fits "
+"the generic function."
+msgstr ""
+
+msgid "Comparison with Clojure"
+msgstr ""
+
+msgid "Clojure has an equivalent, when using `defmulti`."
+msgstr ""
+
+msgid ""
+"Since when declaring a multi-method with `defmulti` we must define the "
+"dispatch function, Clojure uses it to pick the method definition. Since the "
+"dispatch function is required, there is no need for a default behaviour, "
+"such as left-to-right."
+msgstr ""
+
+msgid "Conclusion"
+msgstr ""
+
+msgid ""
+"Making the argument precedence order configurable for generic functions but "
+"not for class definitions makes a lot of sense."
+msgstr ""
+
+msgid ""
+"One shouldn't change the order of arguments of a generic function for the "
+"sake of tailoring it to the CLOS priority ranking algorithm, but doing it "
+"for a class definition is just fine."
+msgstr ""
+
+msgid "TIL."
+msgstr ""
+
+msgid ""
+"CLOS has to make a choice between the first and the second definition of "
+"`yet-another-fn`, but its choice is just a heuristic. What if we want the "
+"choice to be based on the second argument, instead of the first?"
+msgstr ""
+
+msgid ""
+"When declaring a class, we can choose the precedence order, and that is "
+"about it. But when defining a generic function, the order of arguments is "
+"more important to the function semantics, and the argument precedence being "
+"left-to-right is just the default behaviour."
+msgstr ""
+
+msgid "References"
+msgstr ""
+
+msgid ""
+"[Object-Oriented Programming in Common Lisp: A Programmer's Guide to "
+"CLOS](https://en.wikipedia.org/wiki/Object-"
+"Oriented_Programming_in_Common_Lisp), by Sonja E. Keene"
+msgstr ""
+
+msgid "date: 2021-04-24 2"
+msgstr ""
+
+#~ msgid "date: 2021-04-24"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "CLOS has to make a choice between the first and the second definition of "
+#~ "`yet-another-fn`, but its choice is just a heuristic. What if we want to the"
+#~ " choice to be based on the second argument first?"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "When declaring a class, we can choose the precedence order, and that is "
+#~ "about it. But when defining a generic function, the order of argumentws is "
+#~ "more important to the function semantics, and the argument precedence being "
+#~ "left-to-right is just the default behaviour."
+#~ msgstr ""
diff --git a/locale/fr/LC_MESSAGES/_tils/2021-04-24-three-way-conditional-for-number-signs.po b/locale/fr/LC_MESSAGES/_tils/2021-04-24-three-way-conditional-for-number-signs.po
new file mode 100644
index 0000000..925a00b
--- /dev/null
+++ b/locale/fr/LC_MESSAGES/_tils/2021-04-24-three-way-conditional-for-number-signs.po
@@ -0,0 +1,95 @@
+#
+msgid ""
+msgstr ""
+
+msgid "title: Three-way conditional for number signs"
+msgstr ""
+
+msgid "date: 2021-04-24 3"
+msgstr ""
+
+msgid "layout: post"
+msgstr ""
+
+msgid "lang: en"
+msgstr ""
+
+msgid "ref: three-way-conditional-for-number-signs"
+msgstr ""
+
+msgid ""
+"A useful macro from Paul Graham's [On "
+"Lisp](http://www.paulgraham.com/onlisptext.html) book:"
+msgstr ""
+
+msgid ""
+"(defmacro nif (expr pos zero neg)\n"
+" (let ((g (gensym)))\n"
+" `(let ((,g ,expr))\n"
+" (cond ((plusp ,g) ,pos)\n"
+" ((zerop ,g) ,zero)\n"
+" (t ,neg)))))\n"
+msgstr ""
+
+msgid ""
+"The latest example I can think of is section 1.3.3 of [Structure and "
+"Interpretation of Computer "
+"Programs](https://mitpress.mit.edu/sites/default/files/sicp/index.html), "
+"which I was reading recently:"
+msgstr ""
+
+msgid ""
+"(define (search f neg-point pos-point)\n"
+" (let ((midpoint (average neg-point pos-point)))\n"
+" (if (close-enough? neg-point post-point)\n"
+" midpoint\n"
+" (let ((test-value (f midpoint)))\n"
+" (cond ((positive? test-value)\n"
+" (search f neg-point midpoint))\n"
+" ((negative? test-value)\n"
+" (search f midpoint pos-point))\n"
+" (else midpoint))))))\n"
+msgstr ""
+
+msgid ""
+"(define (search f neg-point pos-point)\n"
+" (let ((midpoint (average neg-point pos-point)))\n"
+" (if (close-enough? neg-point post-point)\n"
+" midpoint\n"
+" (nif (f midpoint)\n"
+" (search f neg-point midpoint)\n"
+" (midpoint)\n"
+" (search f midpoint pos-point)))))\n"
+msgstr ""
+
+msgid ""
+"It also avoids `cond`'s extra clunky parentheses for grouping, which is "
+"unnecessary but built-in."
+msgstr ""
+
+msgid ""
+"As a macro, I personally feel it tilts the balance towards expressivenes "
+"despite its extra cognitive load toll."
+msgstr ""
+
+msgid ""
+"After I looked at this macro, I started seeing opportunities to using it in "
+"many places, and yet I didn't see anyone else using it."
+msgstr ""
+
+msgid ""
+"Not that the book should introduce such macro this early, but I couldn't "
+"avoid feeling bothered by not using the `nif` macro, which could even remove"
+" the need for the intermediate `test-value` variable:"
+msgstr ""
+
+#~ msgid ""
+#~ "After I looked at this macro, I started seeing opportunities to using it in "
+#~ "many places, and yet I didn't see anyonelse using it."
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Not that the book should introduce such macro this early, but I couldn't "
+#~ "avoid feeling bothered by not using a `nif` macro, which could even remove "
+#~ "the need for the intermediate `test-value` variable:"
+#~ msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po b/locale/pt/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po
index 86c8389..3c7e6ec 100644
--- a/locale/pt/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po
+++ b/locale/pt/LC_MESSAGES/_articles/2020-10-05-swift2nix-run-swift-inside-nix-builds.po
@@ -12,8 +12,8 @@ msgstr ""
msgid ""
"I wrote a simple little tool called "
-"[swift2nix](https://git.euandreh.xyz/swift2nix/) that allows you trick"
-" Swift's package manager into assuming everything is set up. Here's the "
+"[swift2nix](https://git.euandreh.xyz/swift2nix/) that allows you trick "
+"Swift's package manager into assuming everything is set up. Here's the "
"example from swift2nix's README file:"
msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po b/locale/pt/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po
index 0e0bc8c..ecd28a5 100644
--- a/locale/pt/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po
+++ b/locale/pt/LC_MESSAGES/_articles/2020-11-12-durable-persistent-trees-and-parser-combinators-building-a-database.po
@@ -381,18 +381,18 @@ msgstr ""
#~ msgid ""
#~ "I've started a fork of cbindgen: "
-#~ "[x-bindgen](https://git.euandreh.xyz/x-bindgen/). Right now it is just "
-#~ "a copy of cbindgen verbatim, and I plan to remove all C and C++ emitting "
-#~ "code from it, and add a IR emitting code instead."
+#~ "[x-bindgen](https://git.euandreh.xyz/x-bindgen/). Right now it is just a "
+#~ "copy of cbindgen verbatim, and I plan to remove all C and C++ emitting code "
+#~ "from it, and add a IR emitting code instead."
#~ msgstr ""
#~ msgid ""
#~ "When starting working on x-bindgen, I realized I didn't know what to look "
#~ "for in a header file, as I haven't written any C code in many years. So as I"
-#~ " was writing [libedn](https://git.euandreh.xyz/libedn/), I didn't know "
-#~ "how to build a good C API to expose. So I tried porting the code to C, and "
-#~ "right now I'm working on building a *good* C API for a JSON parser using "
-#~ "parser combinators: [ParsecC](https://git.euandreh.xyz/parsecc/)."
+#~ " was writing [libedn](https://git.euandreh.xyz/libedn/), I didn't know how "
+#~ "to build a good C API to expose. So I tried porting the code to C, and right"
+#~ " now I'm working on building a *good* C API for a JSON parser using parser "
+#~ "combinators: [ParsecC](https://git.euandreh.xyz/parsecc/)."
#~ msgstr ""
#~ msgid ""
diff --git a/locale/pt/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po b/locale/pt/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po
index a7e3382..c85754b 100644
--- a/locale/pt/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po
+++ b/locale/pt/LC_MESSAGES/_articles/2021-01-26-ann-remembering-add-memory-to-dmenu-fzf-and-similar-tools.po
@@ -269,9 +269,9 @@ msgstr ""
msgid ""
"For my personal use, I've [packaged](https://git.euandreh.xyz/package-"
-"repository/) `remembering` for GNU Guix and Nix. Packaging it to any "
-"other distribution should be trivial, or just downloading the tarball and "
-"running `[sudo] make install`."
+"repository/) `remembering` for GNU Guix and Nix. Packaging it to any other "
+"distribution should be trivial, or just downloading the tarball and running "
+"`[sudo] make install`."
msgstr ""
#~ msgid ""
@@ -288,8 +288,8 @@ msgstr ""
#~ msgid ""
#~ "Today I pushed v0.1.0 of "
-#~ "[remembering](https://git.euandreh.xyz/remembering/), a tool to "
-#~ "enhance the interactive usability of menu-like tools, such as "
+#~ "[remembering](https://git.euandreh.xyz/remembering/), a tool to enhance the "
+#~ "interactive usability of menu-like tools, such as "
#~ "[dmenu](https://tools.suckless.org/dmenu/) and "
#~ "[fzf](https://github.com/junegunn/fzf)."
#~ msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po b/locale/pt/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po
index 442e6d0..e30c889 100644
--- a/locale/pt/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po
+++ b/locale/pt/LC_MESSAGES/_articles/2021-02-17-ann-fallible-fault-injection-library-for-stress-testing-failure-scenarios.po
@@ -241,25 +241,6 @@ msgid ""
msgstr ""
msgid ""
-"--- 3.c\t2021-02-17 00:15:38.019706074 -0300\n"
-"+++ 4.c\t2021-02-17 00:44:32.306885590 -0300\n"
-"@@ -1,11 +1,11 @@\n"
-" bool a_function() {\n"
-"- char *s1 = malloc(A_NUMBER);\n"
-"+ char *s1 = MALLOC(A_NUMBER);\n"
-" if (!s1) {\n"
-" return false;\n"
-" }\n"
-" strcpy(s1, \"some string\");\n"
-"\n"
-"- char *s2 = malloc(A_NUMBER);\n"
-"+ char *s2 = MALLOC(A_NUMBER);\n"
-" if (!s2) {\n"
-" free(s1);\n"
-" return false;\n"
-msgstr ""
-
-msgid ""
"With this change, if the program gets compiled with the `-DFALLIBLE` flag "
"the fault-injection mechanism will run, and `MALLOC` will fail once for each"
" `filename`+`lineno` combination. When the flag is missing, `MALLOC` is a "
@@ -342,3 +323,41 @@ msgstr ""
msgid "Patches welcome!"
msgstr ""
+
+msgid ""
+"--- 3.c 2021-02-17 00:15:38.019706074 -0300\n"
+"+++ 4.c 2021-02-17 00:44:32.306885590 -0300\n"
+"@@ -1,11 +1,11 @@\n"
+" bool a_function() {\n"
+"- char *s1 = malloc(A_NUMBER);\n"
+"+ char *s1 = MALLOC(A_NUMBER);\n"
+" if (!s1) {\n"
+" return false;\n"
+" }\n"
+" strcpy(s1, \"some string\");\n"
+"\n"
+"- char *s2 = malloc(A_NUMBER);\n"
+"+ char *s2 = MALLOC(A_NUMBER);\n"
+" if (!s2) {\n"
+" free(s1);\n"
+" return false;\n"
+msgstr ""
+
+#~ msgid ""
+#~ "--- 3.c\t2021-02-17 00:15:38.019706074 -0300\n"
+#~ "+++ 4.c\t2021-02-17 00:44:32.306885590 -0300\n"
+#~ "@@ -1,11 +1,11 @@\n"
+#~ " bool a_function() {\n"
+#~ "- char *s1 = malloc(A_NUMBER);\n"
+#~ "+ char *s1 = MALLOC(A_NUMBER);\n"
+#~ " if (!s1) {\n"
+#~ " return false;\n"
+#~ " }\n"
+#~ " strcpy(s1, \"some string\");\n"
+#~ "\n"
+#~ "- char *s2 = malloc(A_NUMBER);\n"
+#~ "+ char *s2 = MALLOC(A_NUMBER);\n"
+#~ " if (!s2) {\n"
+#~ " free(s1);\n"
+#~ " return false;\n"
+#~ msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_pastebins/2021-04-03-javascript-naive-slugify.po b/locale/pt/LC_MESSAGES/_pastebins/2021-04-03-javascript-naive-slugify.po
new file mode 100644
index 0000000..f6e087b
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/_pastebins/2021-04-03-javascript-naive-slugify.po
@@ -0,0 +1,70 @@
+#
+msgid ""
+msgstr ""
+
+msgid "title: JavaScript naive slugify"
+msgstr ""
+
+msgid "date: 2021-04-03"
+msgstr ""
+
+msgid "layout: post"
+msgstr ""
+
+msgid "lang: en"
+msgstr ""
+
+msgid "ref: javascript-naive-slugify"
+msgstr ""
+
+msgid ""
+"const s = \"Pézão: açaí, saci-pererê.\";\n"
+"\n"
+"function slugify(s) {\n"
+" return s\n"
+" .toLowerCase()\n"
+" .replaceAll(\":\", \"\")\n"
+" .replaceAll(\".\", \"\")\n"
+" .replaceAll(\",\", \"\")\n"
+" .replaceAll(\"-\", \"\")\n"
+" .replaceAll(\"á\", \"a\")\n"
+" .replaceAll(\"ã\", \"a\")\n"
+" .replaceAll(\"à\", \"a\")\n"
+" .replaceAll(\"é\", \"e\")\n"
+" .replaceAll(\"ê\", \"e\")\n"
+" .replaceAll(\"í\", \"i\")\n"
+" .replaceAll(\"ó\", \"o\")\n"
+" .replaceAll(\"ô\", \"o\")\n"
+" .replaceAll(\"ú\", \"u\")\n"
+" .replaceAll(\"ü\", \"u\")\n"
+" .replaceAll(\"ç\", \"c\");\n"
+"}\n"
+"\n"
+"console.log(slugify(s));\n"
+msgstr ""
+
+#~ msgid ""
+#~ "const s = \"Pézão: açaí, saci-pererê.\";\n"
+#~ "\n"
+#~ "function slugify(s) {\n"
+#~ " return s\n"
+#~ " .toLowerCase()\n"
+#~ " .replaceAll(\":\", \"\")\n"
+#~ " .replaceAll(\".\", \"\")\n"
+#~ " .replaceAll(\",\", \"\")\n"
+#~ " .replaceAll(\"-\", \"\")\n"
+#~ " .replaceAll(\"á\", \"a\")\n"
+#~ " .replaceAll(\"ã\", \"a\")\n"
+#~ " .replaceAll(\"à\", \"a\")\n"
+#~ " .replaceAll(\"é\", \"e\")\n"
+#~ " .replaceAll(\"ê\", \"e\")\n"
+#~ " .replaceAll(\"í\", \"i\")\n"
+#~ " .replaceAll(\"ó\", \"o\")\n"
+#~ " .replaceAll(\"ô\", \"o\")\n"
+#~ " .replaceAll(\"ú\", \"u\")\n"
+#~ " .replaceAll(\"ü\", \"u\")\n"
+#~ " .replaceAll(\"ç\", \"c\");\n"
+#~ "}\n"
+#~ "\n"
+#~ "console.log(slugify(s));\n"
+#~ msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po b/locale/pt/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po
index badc41e..d0e9b44 100644
--- a/locale/pt/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po
+++ b/locale/pt/LC_MESSAGES/_screencasts/2021-02-07-autoqemu-automate-installation-and-ssh-setup-of-iso-os-images.po
@@ -57,14 +57,6 @@ msgid "It assumes that `$HOME/.local/bin` is in `$PATH`."
msgstr ""
msgid ""
-"This screencast is a simple demo of automating the installation of Alpine "
-"Linux 3.12.3 standard x86_64 with "
-"[AutoQEMU](https://git.euandreh.xyz/autoqemu/), which is nothing more "
-"than POSIX sh, [expect](https://core.tcl-lang.org/expect/index) scripts and "
-"Makefiles glued together."
-msgstr ""
-
-msgid ""
"pushd `mktemp -d`\n"
"git clone https://git.euandreh.xyz/autoqemu .\n"
"make\n"
@@ -72,6 +64,22 @@ msgid ""
"autoqemu ssh alpine\n"
msgstr ""
+msgid ""
+"This screencast is a simple demo of automating the installation of Alpine "
+"Linux 3.12.3 standard x86_64 with "
+"[AutoQEMU](https://git.euandreh.xyz/autoqemu/about), which is nothing more "
+"than POSIX sh, [expect](https://core.tcl-lang.org/expect/index) scripts and "
+"Makefiles glued together."
+msgstr ""
+
+#~ msgid ""
+#~ "This screencast is a simple demo of automating the installation of Alpine "
+#~ "Linux 3.12.3 standard x86_64 with "
+#~ "[AutoQEMU](https://git.euandreh.xyz/autoqemu/), which is nothing more than "
+#~ "POSIX sh, [expect](https://core.tcl-lang.org/expect/index) scripts and "
+#~ "Makefiles glued together."
+#~ msgstr ""
+
#~ msgid ""
#~ "pushd `mktemp -d`\n"
#~ "git clone https://git.euandreh.xyz/autoqemu .\n"
diff --git a/locale/pt/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po b/locale/pt/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po
index 421e295..6030e0c 100644
--- a/locale/pt/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po
+++ b/locale/pt/LC_MESSAGES/_tils/2020-08-14-browse-a-git-repository-at-a-specific-commit.po
@@ -49,9 +49,6 @@ msgid ""
"current staging area back to what it was before the checkout."
msgstr ""
-msgid "References:"
-msgstr ""
-
msgid ""
"[GIT: Checkout to a specific folder](https://stackoverflow.com/a/16493707) "
"(StackOverflow)"
@@ -107,6 +104,12 @@ msgstr ""
msgid "eu_categories: git"
msgstr ""
+msgid "References"
+msgstr ""
+
+#~ msgid "References:"
+#~ msgstr ""
+
#~ msgid ""
#~ "title: Browse a git repository at a specific commit\n"
#~ "date: 2020-08-14\n"
diff --git a/locale/pt/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po b/locale/pt/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po
index 182061b..1610cea 100644
--- a/locale/pt/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po
+++ b/locale/pt/LC_MESSAGES/_tils/2020-09-05-pull-requests-with-git-the-old-school-way.po
@@ -25,9 +25,9 @@ msgid ""
"The only difference is that you're working with only Git itself, so you're "
"not tied to any Git hosting provider: you can send pull requests across them"
" transparently! You could even use your own "
-"[cgit](https://git.zx2c4.com/cgit/) installation. No need to be locked"
-" in by any of them, putting the \"D\" back in \"DVCS\": it's a "
-"**distributed** version control system."
+"[cgit](https://git.zx2c4.com/cgit/) installation. No need to be locked in by"
+" any of them, putting the \"D\" back in \"DVCS\": it's a **distributed** "
+"version control system."
msgstr ""
msgid "`git request-pull` introduction"
diff --git a/locale/pt/LC_MESSAGES/_tils/2021-04-24-clojure-auto-curry.po b/locale/pt/LC_MESSAGES/_tils/2021-04-24-clojure-auto-curry.po
new file mode 100644
index 0000000..ab59a4f
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/_tils/2021-04-24-clojure-auto-curry.po
@@ -0,0 +1,220 @@
+#
+msgid ""
+msgstr ""
+
+msgid "title: Clojure auto curry"
+msgstr ""
+
+msgid "layout: post"
+msgstr ""
+
+msgid "lang: en"
+msgstr ""
+
+msgid "ref: clojure-auto-curry"
+msgstr ""
+
+msgid "A naive `add` definition, alongside its usage and macroexpansion:"
+msgstr ""
+
+msgid ""
+"user=> (defcurry add\n"
+" [a b c d e]\n"
+" (+ 1 2 3 4 5))\n"
+"#'user/add\n"
+"\n"
+"user=> (add 1)\n"
+"#object[clojure.core$partial$fn__5857 0x2c708440 \"clojure.core$partial$fn__5857@2c708440\"]\n"
+"\n"
+"user=> (add 1 2 3 4)\n"
+"#object[clojure.core$partial$fn__5863 0xf4c0e4e \"clojure.core$partial$fn__5863@f4c0e4e\"]\n"
+"\n"
+"user=> ((add 1) 2 3 4 5)\n"
+"15\n"
+"\n"
+"user=> (((add 1) 2 3) 4 5)\n"
+"15\n"
+"\n"
+"user=> (use 'clojure.pprint)\n"
+"nil\n"
+"\n"
+"user=> (pprint\n"
+" (macroexpand\n"
+" '(defcurry add\n"
+" [a b c d e]\n"
+" (+ 1 2 3 4 5))))\n"
+"(def\n"
+" add\n"
+" (clojure.core/fn\n"
+" ([a b c d e] (+ 1 2 3 4 5))\n"
+" ([a] (clojure.core/partial add a))\n"
+" ([a b] (clojure.core/partial add a b))\n"
+" ([a b c] (clojure.core/partial add a b c))\n"
+" ([a b c d] (clojure.core/partial add a b c d))))\n"
+"nil\n"
+msgstr ""
+
+msgid ""
+"This simplistic `defcurry` definition doesn't support optional parameters, "
+"multi-arity, `&` rest arguments, docstrings, etc., but it could certainly "
+"evolve to do so."
+msgstr ""
+
+msgid ""
+"I like how `defcurry` is so short, and abdicates the responsability of doing"
+" the multi-arity logic to Clojure's built-in multi-arity support. Simple and"
+" elegant."
+msgstr ""
+
+msgid "Same Clojure as before, now with auto-currying via macros."
+msgstr ""
+
+msgid ""
+"Here's a simple macro defined by [Loretta "
+"He](http://lorettahe.github.io/clojure/2016/09/22/clojure-auto-curry) to "
+"create Clojure functions that are curried on all arguments, relying on "
+"Clojure's multi-arity support:"
+msgstr ""
+
+msgid "date: 2021-04-24 1"
+msgstr ""
+
+msgid ""
+"(defmacro defcurry\n"
+" [name args & body]\n"
+" (let [partials (map (fn [n]\n"
+" `(~(subvec args 0 n) (partial ~name ~@(take n args))))\n"
+" (range 1 (count args)))]\n"
+" `(defn ~name\n"
+" (~args ~@body)\n"
+" ~@partials)))\n"
+msgstr ""
+
+msgid "Comparison with Common Lisp"
+msgstr ""
+
+msgid "My attempt at writing an equivalent for Common Lisp gives me:"
+msgstr ""
+
+msgid ""
+"(defun partial (fn &rest args)\n"
+" (lambda (&rest args2)\n"
+" (apply fn (append args args2))))\n"
+"\n"
+"(defun curry-n (n func)\n"
+" (cond ((< n 0) (error \"Too many arguments\"))\n"
+" ((zerop n) (funcall func))\n"
+" (t (lambda (&rest rest)\n"
+" (curry-n (- n (length rest))\n"
+" (apply #'partial func rest))))))\n"
+"\n"
+"(defmacro defcurry (name args &body body)\n"
+" `(defun ,name (&rest rest)\n"
+" (let ((func (lambda ,args ,@body)))\n"
+" (curry-n (- ,(length args) (length rest))\n"
+" (apply #'partial func rest)))))\n"
+msgstr ""
+
+msgid ""
+"Without built-in multi-arity support, we have to do more work, like tracking"
+" the number of arguments consumed so far. We also have to write `#'partial` "
+"ourselves. That is, without dependending on any library, sticking to ANSI "
+"Common Lisp."
+msgstr ""
+
+msgid "The usage is pretty similar:"
+msgstr ""
+
+msgid ""
+"* (defcurry add (a b c d e)\n"
+" (+ a b c d e))\n"
+"ADD\n"
+"\n"
+"* (add 1)\n"
+"#<FUNCTION (LAMBDA (&REST REST) :IN CURRY-N) {100216419B}>\n"
+"\n"
+"* (funcall (add 1) 2 3 4)\n"
+"#<FUNCTION (LAMBDA (&REST REST) :IN CURRY-N) {100216537B}>\n"
+"\n"
+"* (funcall (add 1) 2 3 4 5)\n"
+"15\n"
+"\n"
+"* (funcall (funcall (add 1) 2 3) 4 5)\n"
+"15\n"
+"\n"
+"* (macroexpand-1\n"
+" '(defcurry add (a b c d e)\n"
+" (+ a b c d e)))\n"
+"(DEFUN ADD (&REST REST)\n"
+" (LET ((FUNC (LAMBDA (A B C D E) (+ A B C D E))))\n"
+" (CURRY-N (- 5 (LENGTH REST)) (APPLY #'PARTIAL FUNC REST))))\n"
+"T\n"
+msgstr ""
+
+msgid ""
+"This also require `funcall`s, since we return a `lambda` that doesn't live "
+"in the function namespace."
+msgstr ""
+
+msgid ""
+"Like the Clojure one, it doesn't support optional parameters, `&rest` rest "
+"arguments, docstrings, etc., but it also could evolve to do so."
+msgstr ""
+
+msgid "updated_at: 2021-04-27"
+msgstr ""
+
+#~ msgid ""
+#~ "(defmacro defcurry\n"
+#~ " [fname args & body]\n"
+#~ " (let [partials (map (fn [n]\n"
+#~ " `(~(subvec args 0 n) (partial ~fname ~@(take n args))))\n"
+#~ " (range 1 (count args)))]\n"
+#~ " `(defn ~fname\n"
+#~ " (~args ~@body)\n"
+#~ " ~@partials)))\n"
+#~ msgstr ""
+
+#~ msgid "date: 2021-04-24"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "A simple macro defined by [Loretta "
+#~ "He](http://lorettahe.github.io/clojure/2016/09/22/clojure-auto-curry) to "
+#~ "create Clojure functions that are curried on all arguments, relying on "
+#~ "Clojure's multi-arity support:"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Without built-in multi-arity support, we have to do more work, like tracking"
+#~ " the number of arguments consumed so far. That is, without dependending on "
+#~ "any library, sticking to ANSI Common Lisp."
+#~ msgstr ""
+
+#~ msgid ""
+#~ "(defun curry-n (n fn)\n"
+#~ " (if (= 0 n)\n"
+#~ " (funcall fn)\n"
+#~ " (lambda (&rest rest)\n"
+#~ " (curry-n (something n) fn))))\n"
+#~ "\n"
+#~ "(defun add (a b c d e)\n"
+#~ " (curry-n\n"
+#~ " (length '(a b c d e))\n"
+#~ " (lambda (&rest rest)\n"
+#~ " (apply #'+ rest))))\n"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "(defun curry-n (n fn)\n"
+#~ " (if (= 0 n)\n"
+#~ " (funcall fn)\n"
+#~ " (lambda (&rest rest)\n"
+#~ " (curry-n (something n) fn))))\n"
+#~ "\n"
+#~ "(defun add (a b c d e)\n"
+#~ " (curry-n\n"
+#~ " (length '(a b c d e))\n"
+#~ " (lambda (&rest rest)\n"
+#~ " (apply #'+ rest))))\n"
+#~ msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_tils/2021-04-24-common-lisp-argument-precedence-order-parameterization-of-a-generic-function.po b/locale/pt/LC_MESSAGES/_tils/2021-04-24-common-lisp-argument-precedence-order-parameterization-of-a-generic-function.po
new file mode 100644
index 0000000..6aa66a8
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/_tils/2021-04-24-common-lisp-argument-precedence-order-parameterization-of-a-generic-function.po
@@ -0,0 +1,210 @@
+#
+msgid ""
+msgstr ""
+
+msgid ""
+"title: Common Lisp argument precedence order parameterization of a generic "
+"function"
+msgstr ""
+
+msgid "layout: post"
+msgstr ""
+
+msgid "lang: en"
+msgstr ""
+
+msgid ""
+"ref: common-lisp-argument-precedence-order-parameterization-of-a-generic-"
+"function"
+msgstr ""
+
+msgid ""
+"When CLOS dispatches a method, it picks the most specific method definition "
+"to the argument list:"
+msgstr ""
+
+msgid ""
+"\n"
+"* (defgeneric a-fn (x))\n"
+"#<STANDARD-GENERIC-FUNCTION A-FN (0) {5815ACB9}>\n"
+"\n"
+"* (defmethod a-fn (x) :default-method)\n"
+"#<STANDARD-METHOD A-FN (T) {581DB535}>\n"
+"\n"
+"* (defmethod a-fn ((x number)) :a-number)\n"
+"#<STANDARD-METHOD A-FN (NUMBER) {58241645}>\n"
+"\n"
+"* (defmethod a-fn ((x (eql 1))) :number-1)\n"
+"#<STANDARD-METHOD A-FN ((EQL 1)) {582A7D75}>\n"
+"\n"
+"* (a-fn nil)\n"
+":DEFAULT-METHOD\n"
+"\n"
+"* (a-fn \"1\")\n"
+":DEFAULT-METHOD\n"
+"\n"
+"* (a-fn 0)\n"
+":A-NUMBER\n"
+"\n"
+"* (a-fn 1)\n"
+":NUMBER-1\n"
+msgstr ""
+
+msgid ""
+"CLOS uses a similar logic when choosing the method from parent classes, when"
+" multiple ones are available:"
+msgstr ""
+
+msgid ""
+"* (defclass class-a () ())\n"
+"\n"
+"#<STANDARD-CLASS CLASS-A {583E0B25}>\n"
+"* (defclass class-b () ())\n"
+"\n"
+"#<STANDARD-CLASS CLASS-B {583E7F6D}>\n"
+"* (defgeneric another-fn (obj))\n"
+"\n"
+"#<STANDARD-GENERIC-FUNCTION ANOTHER-FN (0) {583DA749}>\n"
+"* (defmethod another-fn ((obj class-a)) :class-a)\n"
+"; Compiling LAMBDA (.PV-CELL. .NEXT-METHOD-CALL. OBJ):\n"
+"; Compiling Top-Level Form:\n"
+"\n"
+"#<STANDARD-METHOD ANOTHER-FN (CLASS-A) {584523C5}>\n"
+"* (defmethod another-fn ((obj class-b)) :class-b)\n"
+"; Compiling LAMBDA (.PV-CELL. .NEXT-METHOD-CALL. OBJ):\n"
+"; Compiling Top-Level Form:\n"
+"\n"
+"#<STANDARD-METHOD ANOTHER-FN (CLASS-B) {584B8895}>\n"
+msgstr ""
+
+msgid ""
+"Given the above definitions, when inheriting from `class-a` and `class-b`, "
+"the order of inheritance matters:"
+msgstr ""
+
+msgid ""
+"* (defclass class-a-coming-first (class-a class-b) ())\n"
+"#<STANDARD-CLASS CLASS-A-COMING-FIRST {584BE6AD}>\n"
+"\n"
+"* (defclass class-b-coming-first (class-b class-a) ())\n"
+"#<STANDARD-CLASS CLASS-B-COMING-FIRST {584C744D}>\n"
+"\n"
+"* (another-fn (make-instance 'class-a-coming-first))\n"
+":CLASS-A\n"
+"\n"
+"* (another-fn (make-instance 'class-b-coming-first))\n"
+":CLASS-B\n"
+msgstr ""
+
+msgid ""
+"Combining the order of inheritance with generic functions with multiple "
+"arguments, CLOS has to make a choice of how to pick a method given two "
+"competing definitions, and its default strategy is prioritizing from left to"
+" right:"
+msgstr ""
+
+msgid ""
+"* (defgeneric yet-another-fn (obj1 obj2))\n"
+"#<STANDARD-GENERIC-FUNCTION YET-ANOTHER-FN (0) {584D9EC9}>\n"
+"\n"
+"* (defmethod yet-another-fn ((obj1 class-a) obj2) :first-arg-specialized)\n"
+"#<STANDARD-METHOD YET-ANOTHER-FN (CLASS-A T) {5854269D}>\n"
+"\n"
+"* (defmethod yet-another-fn (obj1 (obj2 class-b)) :second-arg-specialized)\n"
+"#<STANDARD-METHOD YET-ANOTHER-FN (T CLASS-B) {585AAAAD}>\n"
+"\n"
+"* (yet-another-fn (make-instance 'class-a) (make-instance 'class-b))\n"
+":FIRST-ARG-SPECIALIZED\n"
+msgstr ""
+
+msgid ""
+"For that, we use the `:argument-precedence-order` option when declaring a "
+"generic function:"
+msgstr ""
+
+msgid ""
+"* (defgeneric yet-another-fn (obj1 obj2) (:argument-precedence-order obj2 obj1))\n"
+"#<STANDARD-GENERIC-FUNCTION YET-ANOTHER-FN (2) {584D9EC9}>\n"
+"\n"
+"* (yet-another-fn (make-instance 'class-a) (make-instance 'class-b))\n"
+":SECOND-ARG-SPECIALIZED\n"
+msgstr ""
+
+msgid ""
+"I liked that the `:argument-precedence-order` option exists. We shouldn't "
+"have to change the arguments from `(obj1 obj2)` to `(obj2 obj1)` just to "
+"make CLOS pick the method that we want. We can configure its default "
+"behaviour if desired, and keep the order of arguments however it best fits "
+"the generic function."
+msgstr ""
+
+msgid "Comparison with Clojure"
+msgstr ""
+
+msgid "Clojure has an equivalent, when using `defmulti`."
+msgstr ""
+
+msgid ""
+"Since when declaring a multi-method with `defmulti` we must define the "
+"dispatch function, Clojure uses it to pick the method definition. Since the "
+"dispatch function is required, there is no need for a default behaviour, "
+"such as left-to-right."
+msgstr ""
+
+msgid "Conclusion"
+msgstr ""
+
+msgid ""
+"Making the argument precedence order configurable for generic functions but "
+"not for class definitions makes a lot of sense."
+msgstr ""
+
+msgid ""
+"One shouldn't change the order of arguments of a generic function for the "
+"sake of tailoring it to the CLOS priority ranking algorithm, but doing it "
+"for a class definition is just fine."
+msgstr ""
+
+msgid "TIL."
+msgstr ""
+
+msgid ""
+"CLOS has to make a choice between the first and the second definition of "
+"`yet-another-fn`, but its choice is just a heuristic. What if we want the "
+"choice to be based on the second argument, instead of the first?"
+msgstr ""
+
+msgid ""
+"When declaring a class, we can choose the precedence order, and that is "
+"about it. But when defining a generic function, the order of arguments is "
+"more important to the function semantics, and the argument precedence being "
+"left-to-right is just the default behaviour."
+msgstr ""
+
+msgid "References"
+msgstr ""
+
+msgid ""
+"[Object-Oriented Programming in Common Lisp: A Programmer's Guide to "
+"CLOS](https://en.wikipedia.org/wiki/Object-"
+"Oriented_Programming_in_Common_Lisp), by Sonja E. Keene"
+msgstr ""
+
+msgid "date: 2021-04-24 2"
+msgstr ""
+
+#~ msgid "date: 2021-04-24"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "CLOS has to make a choice between the first and the second definition of "
+#~ "`yet-another-fn`, but its choice is just a heuristic. What if we want to the"
+#~ " choice to be based on the second argument first?"
+#~ msgstr ""
+
+#~ msgid ""
+#~ "When declaring a class, we can choose the precedence order, and that is "
+#~ "about it. But when defining a generic function, the order of argumentws is "
+#~ "more important to the function semantics, and the argument precedence being "
+#~ "left-to-right is just the default behaviour."
+#~ msgstr ""
diff --git a/locale/pt/LC_MESSAGES/_tils/2021-04-24-three-way-conditional-for-number-signs.po b/locale/pt/LC_MESSAGES/_tils/2021-04-24-three-way-conditional-for-number-signs.po
new file mode 100644
index 0000000..925a00b
--- /dev/null
+++ b/locale/pt/LC_MESSAGES/_tils/2021-04-24-three-way-conditional-for-number-signs.po
@@ -0,0 +1,95 @@
+#
+msgid ""
+msgstr ""
+
+msgid "title: Three-way conditional for number signs"
+msgstr ""
+
+msgid "date: 2021-04-24 3"
+msgstr ""
+
+msgid "layout: post"
+msgstr ""
+
+msgid "lang: en"
+msgstr ""
+
+msgid "ref: three-way-conditional-for-number-signs"
+msgstr ""
+
+msgid ""
+"A useful macro from Paul Graham's [On "
+"Lisp](http://www.paulgraham.com/onlisptext.html) book:"
+msgstr ""
+
+msgid ""
+"(defmacro nif (expr pos zero neg)\n"
+" (let ((g (gensym)))\n"
+" `(let ((,g ,expr))\n"
+" (cond ((plusp ,g) ,pos)\n"
+" ((zerop ,g) ,zero)\n"
+" (t ,neg)))))\n"
+msgstr ""
+
+msgid ""
+"The latest example I can think of is section 1.3.3 of [Structure and "
+"Interpretation of Computer "
+"Programs](https://mitpress.mit.edu/sites/default/files/sicp/index.html), "
+"which I was reading recently:"
+msgstr ""
+
+msgid ""
+"(define (search f neg-point pos-point)\n"
+" (let ((midpoint (average neg-point pos-point)))\n"
+" (if (close-enough? neg-point post-point)\n"
+" midpoint\n"
+" (let ((test-value (f midpoint)))\n"
+" (cond ((positive? test-value)\n"
+" (search f neg-point midpoint))\n"
+" ((negative? test-value)\n"
+" (search f midpoint pos-point))\n"
+" (else midpoint))))))\n"
+msgstr ""
+
+msgid ""
+"(define (search f neg-point pos-point)\n"
+" (let ((midpoint (average neg-point pos-point)))\n"
+" (if (close-enough? neg-point post-point)\n"
+" midpoint\n"
+" (nif (f midpoint)\n"
+" (search f neg-point midpoint)\n"
+" (midpoint)\n"
+" (search f midpoint pos-point)))))\n"
+msgstr ""
+
+msgid ""
+"It also avoids `cond`'s extra clunky parentheses for grouping, which is "
+"unnecessary but built-in."
+msgstr ""
+
+msgid ""
+"As a macro, I personally feel it tilts the balance towards expressivenes "
+"despite its extra cognitive load toll."
+msgstr ""
+
+msgid ""
+"After I looked at this macro, I started seeing opportunities to using it in "
+"many places, and yet I didn't see anyone else using it."
+msgstr ""
+
+msgid ""
+"Not that the book should introduce such macro this early, but I couldn't "
+"avoid feeling bothered by not using the `nif` macro, which could even remove"
+" the need for the intermediate `test-value` variable:"
+msgstr ""
+
+#~ msgid ""
+#~ "After I looked at this macro, I started seeing opportunities to using it in "
+#~ "many places, and yet I didn't see anyonelse using it."
+#~ msgstr ""
+
+#~ msgid ""
+#~ "Not that the book should introduce such macro this early, but I couldn't "
+#~ "avoid feeling bothered by not using a `nif` macro, which could even remove "
+#~ "the need for the intermediate `test-value` variable:"
+#~ msgstr ""