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 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