This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2023-06-29
Channels
- # announcements (44)
- # architecture (12)
- # babashka (45)
- # beginners (56)
- # calva (16)
- # cider (34)
- # clj-kondo (6)
- # clojure (47)
- # clojure-austin (2)
- # clojure-brasil (3)
- # clojure-europe (39)
- # clojure-germany (2)
- # clojure-nl (1)
- # clojure-norway (39)
- # clojurescript (7)
- # cursive (1)
- # datahike (2)
- # datomic (28)
- # emacs (8)
- # gratitude (3)
- # humbleui (4)
- # hyperfiddle (45)
- # kaocha (1)
- # lsp (94)
- # nbb (2)
- # off-topic (29)
- # practicalli (8)
- # releases (2)
- # shadow-cljs (6)
- # squint (17)
- # tools-deps (12)
- # vim (11)
God morgen til alle sammen, men spesielt til Leif fordi han var så hyggelig med meldingen sin!
Jeg har nå gjort et første forsøk på å dele opp mine shell utils i flere filer/namespaces:
https://github.com/leifericf/leifs-utils/tree/main/src/leifs_utils
Og det funker ganske greit egentlig.
Men! Når jeg stenger VS Code/Calva eller starter REPL på nytt, så får jeg ikke automatisk lastet inn alle namespaces som er inkludert via :require
.
Så jeg må innom hver enkelt fil evaluere dem på nytt i REPL, som er tungvindt og sikkert dumt 😅
Hvordan "evaluerer man alle expressions i alle namespaces" når man starter et nytt REPL?
Nå vet ikke jeg hvordan det fønker i babashka, men vanligvis kan man legge til requires i user.clj
, så blir det dratt inn automatisk i replet. 🙂
Fant du ut av det? Tror å slenge på {:paths ["src"]}
i bb.edn
bør funke. I tillegg er det en syklisk avhengighet som f.eks. kan fikses ved å fjerne leifs-utils.file-system/home
og heller bruke babashka.fs/home
direkte i leifs-utils.settings
.
Jeg prøvde det med bb.edn
men fikk det ikke til å fungere. Kanskje jeg gjorde noe feil. Men @U3X7174KS har også gitt meg mange gode tips som jeg har tenkt å teste ut på kontoret i morgen hvis jeg får tid.
Er det forresten en funksjon eller et bibliotek man kan bruke for å avdekke sykliske avhengigheter programmatisk?
Såvidt jeg kunne skjønne lastes ikke user.clj som default når du starter en REPL med bb
. Men jeg er åpen for å bli motbevist, synes det var litt rart.
> Sykliske avhengigheter > Jeg fikk en feilmelding som advarte meg mot sykliske avhengigheter rett i REPL. Kanskje du får noe likende i Calva når du prøver å importere et ns? https://github.com/leifericf/leifs-utils/pull/1#issuecomment-1613154093
Jeg får beskjed at clojure.core/load
ikke finnes (brukes i leifs-utils.settings
). Prøvde bytte ut med load-file
, det funka bedre. Så når jeg
1. bruker load-file
i stedet for load
2. legger {:paths ["src"]}
i bb.edn
3. fikser syklisk avhengighet
så virker bb
og replet slike jeg forventer at det bør 🙂
Tipper grunnen til at load
ikke fins er at den bruker kompilatoren til Clojure, som ikke finnes i Babashka.
Aha! Etter å ha restartet REPL ser jeg også feilmeldingen om sykliske avhengigheter, ja.
; clojure.lang.ExceptionInfo: Cyclic load dependency: [ leifs-utils.settings ]->leifs-utils.file-system->[ leifs-utils.settings ]
Ahaaa, når det gjelder load
var jeg ikke oppmerksom på at den fantes fra før av.
(ns leifs-utils.settings
(:require [clojure.edn :as edn]
[leifs-utils.file-system :as file]))
(def settings (load "settings.edn"))
(defn load [path]
(edn/read-string (slurp path)))
(defn get-repo-root-path []
(str (file/home) (:local/repo-root-dir settings)))
(comment
(get-repo-root-path))
Her trodde jeg (def settings (load "settings.edn"))
brukte min versjon av load
og ikke clojure.core/load
.Jeg har visst også gjort samme feil her:
(ns leifs-utils.time
(:import [java.time ZonedDateTime]
[java.time.format DateTimeFormatter]))
(defn now []
(ZonedDateTime/now))
(defn format [timestamp pattern]
(.format timestamp (DateTimeFormatter/ofPattern pattern)))
(comment
(-> (now)
(format "yyyyMMdd-HHmmss")))
Hvor min funksjon format
krasjer med clojure.core/format
.Nå funker det, ja! Jeg måtte bare fikse de dumme feilene mine, og putte {:paths ["src"]}
i bb.edn
.
det er kanskje mere en REPL-greie? Alle (?) repls starter i namespacet user, så om du lager den fila så blir den evaluert når replet starter opp
Også er det et hint her kanskje også:
Evaluating code from settings: 'calva.autoEvaluateCode.onConnect.clj'
Men kanskje det ikke er lurt med Calva-spesifikk kode hvis en ønsker å bruke andre editorer/REPLs også. (?)
https://clojure.org/reference/repl_and_main#_launching_a_repl > The REPL prompt shows the name of the current namespace (ns), which defaults to user.
Hvis jeg starter mitt lille hobby-prosjekt i kommandolinjen (`cli -X:dev`) så lastes user-namespacet. Så dine egne namespaces kan lastes via user-namespacet 😊
jeg har for eksempel user-namespacet mitt liggende i en dev-folder som kun legges til i “paths” når man bruker :dev
-alias.
Dette om bb.edn
https://book.babashka.org/#_classpath virker relevant ved første øyekast.
Ja, det kan sikkert settes opp på en eller annen måte, men antall ganger jeg har trykket b c
(branch create) i Magit og skrevet inn navnet på den nye branchen min og så fått beskjed om at den naturlig nok ikke er et gyldig start sted….
Hver eneste gang ja @U04V5VAUN 😅 det er nok magit som hinter om at brancher er noe dritt 😄
Har fått mer hjelp i https://clojurians.slack.com/archives/CLX41ASCS/p1688035620542469 🙂 Skal nok klare å finne ut av det med litt mer fikling.
> Men! Når jeg stenger VS Code/Calva eller starter REPL på nytt, så får
> jeg ikke automatisk lastet inn alle namespaces som er inkludert via :require
.
> Så jeg må innom hver enkelt fil evaluere dem på nytt i REPL, som er tungvindt og sikkert dumt 😅
> Hvordan "evaluerer man alle expressions i alle namespaces" når man starter et nytt REPL? (edited)
@leif.eric.fredheim hva er det du prøver å få til? Jeg skjønner ikke helt 😅
Ønsker du å ha alle funksjonene fra alle navnerommene dine tilgjengelig i ett navnerom (feks user
eller repl
? Eller ønsker du kun enkelte funksjoner? Eller vil du bare sørge for at du har lastet alle navnerommene én gang (med require
) så du får med sideeffekter?
feks noe sånt: https://github.com/leifericf/leifs-utils/pull/1
Men jeg støter på et problem med en syklisk avhengighet:
(ns leifs-utils.settings
(:require [clojure.edn :as edn]
[leifs-utils.file-system :as file]))
og
(ns leifs-utils.file-system
(:require [babashka.fs :as file]
[clojure.string :as str]
[leifs-utils.settings :as settings]
[leifs-utils.time :as time]))
Problemet jeg opplever er at, når jeg skal jobbe på f.eks. git.clj
i REPL, som avhenger av leifs-utils.shell
og andre navnerom, så må jeg åpne de andre filene (`shell.clj` i eksempelet) og manuelt evaluere innholdet der, før jeg kan evaluere funksjoner i git.clj
. Jeg ønsker å kunne åpne én fil i editoren og jobbe på den i REPL uten å måtte evaluere andre navnerom manuelt først. Beklager den noe klønete forklaringen min fra tidligere. Og takk for PR med eksempel! Mitt livs første PR 🙂
> Jeg ønsker å kunne åpne én fil i editoren og jobbe på den i REPL uten å måtte evaluere andre navnerom manuelt først. Sånn jeg forstår det, burde det fungere ut av boksen! I PR-en min funker det fint med en JVM-repl, men jeg får problemer med en babashka-repl.
Jeg bruker ofte en JVM-repl til å jobbe med babashka-ting. Man kan starte med bb print-deps > deps.edn
, så har man en JVM-repl med de samme avhengighetene som man har ut av boksen i babashka.
Det er også det @U5H74UNSF anbefaler i babashka-conf-talken sin:
https://www.youtube.com/watch?v=KKvancXJJJg
Jeg la noen eksempler i PR-en. Legger den til side for nå. Tror du kommer langt med en kombinasjon av https://clojuredocs.org/clojure.core/require (funksjonen) og https://clojuredocs.org/clojure.core/in-ns!