Kiel Mi Kreas Lispajn Projektojn

English ∅ Esperanto
2025-08-04 19:25:07 +0800

Oni ne havas ideon kion oni provas atingi ĝis oni jam atingis ĝin.
—Gerald Jay SUSSMAN

lisp lizard

Enhavotabelo

Enkonduko

Mia originala intenco krei ĉi tiun artikolon estas por krei la duan parton de la unua artikolo pri skriptado en lispo. Mia plano estas paroli kiel mi aliras komandlinian skritadon per lispo. Anstataŭe, tio kion mi deziras priparoli nun estas kiel mi kreas lispajn projekton, per maniero kiu malplilongigas la inicialan tempon por krei reuzeblan kodon. Mi faras ĉi tion ofte, kaj mi pensas, ke estus pli bone se mi parolas pri ĝi, anstataŭe. Kunokaze, ĉi tiu aliro ja uzas la manieron kiel mi skribas lispajn skriptojn por la komandlinio. Mi kredas, ke mi eblas povi pafi du birdojn per ĉi tio.

Motivo

Skribi propran projektan kreilon estas maturiĝrito en lisplando. Onidire, vi ne povas nomi vin lispisto ĝis vi povas krei duondecan ilon kiu kreas projektajn ostarojn.

Mia ĉefa motivo en skribi mian propran projektan kreilon venis ne pro ne ŝati la haveblajn ilojn ĉie. Mi ne ŝatas ilin ne pro tio ke ili malbonas. Mi ne ŝatas ilin ĉar ili ne estas taŭgaj por miaj bezonoj. Mi havas propran manieron por strukturi miajn dozierojn kaj dosierujojn, kaj modifi la ekzistantajn ilojn por adapti miajn bezonojn signifus ke mi devas krei mian ilon, eventuale.

Alia tialo kial mi deziras krei mian propran ilon estas la kapablo por specifi la erojn kiujn mi bezonas por la projektoj kiujn ni bezonas. Mia teamo havas specialajn bezonojn kiuj bezonas atenton. Ni uzas Nix kaj Flakes. Por tio, ni uzas la metodojn kiuj estas skribitaj ĉi tie kaj ĉi tie. Ni ankaŭ faras plene da komandlinian verkon, do ni bezonas manieron por analizi komandliniajn opciojn kaj argumentojn.

Instalo

Oni eble venas al ĉi tiu artikolo ĉar oni estas kurioza, sed oni ne ankoraŭ havas la bazilojn; aŭ oni venas ĉi tien, por ekzameni pri kio estas la tedaĵo. Ambaŭmaniere, mi estas ĉi tie por gvidi vin.

La programaro kiu oni bezonas estas la jene:

  1. SBCL
  2. Quicklisp
  3. Marie

SBCL

La nura deca malfermitkoda lispa realigo, nuntempe, estas SBCL. Ĝi funkcias sur x86, x86_64,kaj aarch64. Ĝi kuras sur linukso, makintoŝo, kaj vindozo. Ĝi liveras altkvalitan plejbonigitan kodon. Ĉe la komerca flako, estas LispWorks, kiun mi uzas ĉefe. La aliaj realigoj estas afablaj, sed ĝi ne estas haveblaj sur aŭ linukso x86_64 kaj makintoŝo aarch64, kiuj estas la operaciumoj kiujn mi nune prizorgas.

Oni povas rekte iri al la retejo de SBCL por elŝuti ĝin, aŭ oni povas uzi la pakajn administrilojn de la operaciumo. La komando devus aspekti jene:

sudo apt install -y sbcl

brew install sbcl

Sed, oni jam scias tion kion mi celas 😉

Quicklisp

Quicklisp estas la defakta normo por instali lispajn bibliotekojn. Ne estas surfacaj sonoriloj kaj fajfiloj. Ĝi simple funkcias. Jen unu-linia komando por instali ĝin sur linukso aŭ makintoŝo:

curl -O https://beta.quicklisp.org/quicklisp.lisp && sbcl --load quicklisp.lisp --eval '(quicklisp-quickstart:install)' --eval '(let ((ql-util::*do-not-prompt* t)) (ql:add-to-init-file) (sb-ext:quit))'

Por kontroli se ĝi jam estis instalita, rulu la jenan:

sbcl --noinform --eval '(princ (ql:client-version))' --quit

Ĝi devas mencii ion kiel la jenan:

"2021-02-13"

Marie

Marie, aliflake, estas la biblioteko kiu faras la artifikojn de krei la projekton. Ni ankaŭ bezonas Clingon por helpi nin pri komandlinia analizado. Por preni ilin, rulu la jenan:

mkdir ~/common-lisp
cd ~/common-lisp
git clone https://github.com/vedainc/marie
sbcl --noinform --eval '(ql:quickload :clingon)' --quit

Sekve, ni metu etan funkcion en la ŝelagordo por igi la aferojn pli facilaj. Rulu la jenan komandod, ŝanĝante ~/.zshenv al ~/.bashrc, taŭge:

cat >> ~/.zshenv << EOF
function mk {
  sbcl --noinform --eval '(ql:quickload :marie)' --eval "(marie:make-project \"\$1\")" --quit
}
EOF
. ~/.zshenv

Sed, vi jam scias la ĉefan ideon. Kaj cetere, mi ne faras ian ajn fiŝan ŝelan fekon.

Bazaferoj

Do, ni nun havas la ilojn instalitaj, oni nun povas krei projekton foo:

mk foo

Tio kion ĝi kreas estas la jena arbo:

├── flake.nix
├── foo-tests.asd
├── foo.asd
├── makefile
├── README.org
├── shells.nix
├── src
│   ├── build.lisp
│   ├── core.lisp
│   ├── driver.lisp
│   ├── main.lisp
│   ├── specials.lisp
│   ├── user.lisp
│   └── version.lisp
└── t
    ├── driver-tests.lisp
    ├── main-tests.lisp
    ├── user-tests.lisp
    └── version.lisp

3 dosierujoj, 17 dosieroj

Por kontroli se foo ja funkcias, ni muntu ĝian plenumeblan dosieron:

cd ~/common-lisp/foo
make
./foo --help

Ĝi devas montri ion kiel la jena:

NAME:
  foo - 0.0.0

USAGE:
  foo [global-options] [<command>] [command-options] [arguments ...]

OPTIONS:
      --help     display usage information and exit
      --version  display version and exit
  -v, --verbose  verbosity [default: 0]

COMMANDS:
  find, f               find files
  zsh-completions, zsh  generate the Zsh completion script
  print-doc, doc        print the documentation

Finrimarkoj

Marie ebligas min rapide krei prototipan kodon el ideo kaj igi ĝin ruleblan frue. Ĉi tiu ilo ebligas mi krei plenumeblajn dosierojn kiujn mi povas ĵeti ĉien. Mi uzas ĉi tiujn ilojn por krei Vix, (tre) maldika kovrilo ĉirkaŭ la Nix-ekosistemo.