summaryrefslogtreecommitdiff
path: root/log-240211-1.gmi
diff options
context:
space:
mode:
authortslil clingman <>2024-02-11 13:13:30 +0100
committertslil clingman <>2024-02-11 13:43:40 +0100
commit13ffbda4cc641a3c048eb2344f8c7303dc341fa0 (patch)
tree138ed811e91d3b443c8cb7f0a3ff39b8686d313e /log-240211-1.gmi
parent849e13bd34d55d4a98b6463a5826683053995df7 (diff)
BQN setup
Diffstat (limited to 'log-240211-1.gmi')
-rw-r--r--log-240211-1.gmi200
1 files changed, 200 insertions, 0 deletions
diff --git a/log-240211-1.gmi b/log-240211-1.gmi
new file mode 100644
index 0000000..2d151ab
--- /dev/null
+++ b/log-240211-1.gmi
@@ -0,0 +1,200 @@
+Time-stamp: <2024-02-11 12h13 UTC>
+
+# Finally an APL for my flying saucer?
+
+> Let's postpone the why and what of BQN, and address the how
+
+Suppose that you're interested in using
+
+=> https://mlochbaum.github.io/BQN/index.html BQN
+
+but you're troubled by not having any. Well, if you're an Arch linux and using emacs, the following should see you through
+
+## Building and installing
+
+### CBQN
+
+I found the AUR package for CBQN lacking, in that it didn't compile the shared libraries which i wanted for the LSP integration below. To that end, here's what i'm using
+
+```
+$ cat PKGBUILD
+# Maintainer: Firegem <mrfiregem [at] protonail [dot] ch>
+pkgname=cbqn-git
+pkgver=r2743.8c18fddd
+pkgrel=1
+pkgdesc="A BQN implementation in C."
+arch=('x86_64' 'i686' 'aarch64' 'arm')
+url="https://github.com/dzaima/CBQN"
+license=('Apache' 'Boost' 'GPL3' 'MIT')
+depends=('glibc' 'libffi')
+optdepends=('ttf-bqn386: BQN and APL compatible font')
+makedepends=('git' 'clang')
+provides=("${pkgname%-git}")
+conflicts=("${pkgname%-git}")
+source=("${pkgname%-git}::git+${url}.git")
+md5sums=('SKIP')
+
+pkgver() {
+ cd "${srcdir}/${pkgname%-git}"
+ printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
+}
+
+build() {
+ cd "${srcdir}/${pkgname%-git}"
+ make PIE='-pie' o3n
+ make PIE='-pie' shared-o3
+}
+
+package() {
+ cd "${srcdir}/${pkgname%-git}"
+ make PREFIX="${pkgdir}/usr/" install
+}
+```
+
+the changes to build() and package() are minor, but appear to be necessary.
+
+With that it should be possible to install a functioning BQN compiler and REPL.
+
+#### BQN LSP
+
+=> https://git.sr.ht/~detegr/bqnlsp
+
+Cloning and building this should work now that the above PKGBUILD puts /usr/lib/libcbqn.so onto the file system. Not too much to say here, other than copy the resulting bqnlsp into your path somewhere
+
+## Emacs integration
+
+Fortunately for us, all of the hard work has already been done
+
+```
+(use-package bqn-mode
+ :ensure t
+ :defer
+ :bind (:map bqn-mode-map
+ ("M-TAB" . expand-abbrev)
+ ("C-c r r" . bqn-comint-eval-dwim)
+ ("C-c r b" . bqn-comint-eval-buffer))
+ :hook (bqn-mode . (lambda () (eglot-ensure) (bqn-comint-buffer)))
+ :config
+ (require 'bqn-keymap-mode)
+ (require 'bqn-glyph-mode))
+```
+
+Note that the first time this is run eglot may ask for the path of bqnlsp, simply provide it.
+
+### Bonus round: abbrev-mode for entering symbols
+
+At first when using BQN i found that while i could remember the names of the various glyphs in which i was interested, i could not recall where they were on the "BQN Keyboard"---a task not aided by the fact that i don't use QWERTY⁰. To that end i wrote some abbrev aliases so that i could type the names and press either space or whatever the favourite abbrev trigger was to replace the word with the glyph
+
+```
+(define-abbrev-table 'bqn-mode-abbrev-table
+ '( ;; funtions
+ ("abs" "│")
+ ("assert" "!")
+ ("ceiling" "⌈")
+ ("classify" "⊐")
+ ("conj" "∧")
+ ("couple" "≍")
+ ("deduplicate" "⍷")
+ ("depth" "≡")
+ ("deshape" "⥊")
+ ("dgrade" "⍒")
+ ("disj" "∨")
+ ("divide" "÷")
+ ("drop" "↓")
+ ("dsort" "∧")
+ ("enlist" "⋈")
+ ("find" "⍷")
+ ("floor" "⌊")
+ ("group" "⊔")
+ ("gt" ">")
+ ("gte" "≥")
+ ("indices" "/")
+ ("join" "∾")
+ ("left" "⊣")
+ ("length" "≠")
+ ("lshift" "«")
+ ("lt" "<")
+ ("lte" "≤")
+ ("match" "≡")
+ ("maximum" "⌈")
+ ("member" "∊")
+ ("minimum" "⌊")
+ ("minus" "¯")
+ ("modulus" "│")
+ ("multiply" "×")
+ ("neg" "¬")
+ ("neq" "≠")
+ ("nmatch" "≢")
+ ("occurrence" "⊒")
+ ("pair" "⋈")
+ ("pick" "⊑")
+ ("power" "⋆")
+ ("prefix" "↑")
+ ("range" "↕")
+ ("recip" "÷")
+ ("replicate" "/")
+ ("reshape" "⥊")
+ ("reverse" "⌽")
+ ("right" "⊢")
+ ("root" "√")
+ ("rshift" "»")
+ ("select" "⊏")
+ ("shape" "≢")
+ ("sign" "×")
+ ("solo" "≍")
+ ("span" "¬")
+ ("sqrt" "√")
+ ("suffix" "↓")
+ ("take" "↑")
+ ("transpose" "⍉")
+ ("ugrade" "⍋")
+ ("usort" "∨")
+ ;; combinators
+ ("atop" "∘")
+ ("catch" "⎊")
+ ("choose" "◶")
+ ("constant" "˙")
+ ("lhook" "⊸")
+ ("over" "○")
+ ("rhook" "⟜")
+ ("self" "˜")
+ ("swap" "˜")
+ ("under" "⌾")
+ ("valence" "⊘")
+ ;; 1-modifiers
+ ("cell" "˘")
+ ("each" "¨")
+ ("fold" "´")
+ ("insert" "˝")
+ ("scan" "`")
+ ("table" "⌜")
+ ("undo" "⁼")
+ ;; 2-modifiers
+ ("depth" "⚇")
+ ("rank" "⎉")
+ ("repeat" "⍟")
+ ;; syntax
+ ("define" "←")
+ ("export" "⇐")
+ ("change" "↩")
+ ("nothing" "·")
+ ("sep" "⋄")
+ ;; constants
+ ("pi" "π")
+ ("infty" "∞")))
+```
+
+to make this not irritating i found myself also setting
+
+```
+(setq save-abbrevs 'silently)
+```
+
+and adding (abbrev-mode) to the bqn-mode hook.
+
+Happy BQN'ing!
+
+---
+
+⁰ For the curious
+=> https://git.sr.ht/~tslil/keyboard