diff --git a/Janet/.envrc b/Janet/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/Janet/.envrc @@ -0,0 +1 @@ +use flake diff --git a/Janet/chapter2/example.janet b/Janet/chapter2/example.janet new file mode 100644 index 0000000..5191f9b --- /dev/null +++ b/Janet/chapter2/example.janet @@ -0,0 +1,14 @@ +(def skadi @{:name "Skadi" :type "German Shepherd"}) +(def odin @{:name "Odin" :type "German Shepherd"}) + +(def people + [{:name "ian" :dogs [skadi odin]} + {:name "kelsey" :dogs [skadi odin]} + {:name "jeffrey" :dogs []}]) + +(pp people) + +(defn main[&] + (set (odin :type) + "Well mostly German Shepherd but he's mixed with some") + (pp people)) diff --git a/Janet/chapter2/shader-example.janet b/Janet/chapter2/shader-example.janet new file mode 100644 index 0000000..200afdb --- /dev/null +++ b/Janet/chapter2/shader-example.janet @@ -0,0 +1,4 @@ +(def gamma-shader (slurp "gamma.fs")) + +(defn main[&] + (print gamma-shader)) diff --git a/Janet/chapter3/macro-example.janet b/Janet/chapter3/macro-example.janet new file mode 100644 index 0000000..ccd64d1 --- /dev/null +++ b/Janet/chapter3/macro-example.janet @@ -0,0 +1,13 @@ +(use ./set-x-verbose) + +(defn main [&] + (set-x + (var sum 0) + (for i 0 10 + (+= sum i)) + (print sum))) + +(print) +(print "and this is what main looks like:") +(print) +(pp (disasm main)) diff --git a/Janet/chapter3/meta.janet b/Janet/chapter3/meta.janet new file mode 100644 index 0000000..982d8f8 --- /dev/null +++ b/Janet/chapter3/meta.janet @@ -0,0 +1,19 @@ +(defn sequence [& fs] + (fn [&] + (each f fs + (f)))) + +(defn first-word [] + (prin "hello")) + +(defn space [] + (prin " ")) + +(defn second-word [] + (prin "world")) + +(defn newline [] + (print)) + +(def main + (sequence first-word space second-word newline)) diff --git a/Janet/chapter3/querify.janet b/Janet/chapter3/querify.janet new file mode 100644 index 0000000..3c23b61 --- /dev/null +++ b/Janet/chapter3/querify.janet @@ -0,0 +1,23 @@ +(import sqlite3) + +(defmacro querify [schema-file] + ~(defn ,(symbol table-name) [conn] + (sqlite3/eval conn ,(string/format "select * from %s;" table-name))) + + (def conn (sqlite3/open ":memory:")) + (sqlite3/eval conn (string (slurp schema-file))) + (def tables + (->> (sqlite3/eval conn "select name from sqlite_schema where type = 'table';") + (map |($ :name)) + (filter |(not (string/has-prefix? "sqlite_" $))))) + (sqlite3/close conn) + + ~(upscope + ,;(map table-definition tables))) + +(querify "schema.sql") + +(defn main [&] + (def conn (sqlite3/open "db.sqlite")) + (pp (people conn)) + (pp (grudges conn))) diff --git a/Janet/chapter3/schema.sql b/Janet/chapter3/schema.sql new file mode 100644 index 0000000..be5d259 --- /dev/null +++ b/Janet/chapter3/schema.sql @@ -0,0 +1,10 @@ +create table people (id integer primary key, name text not null); + +create table grudges ( + id integer primary key, + holder integer not null, + against integer not null, + reason text not null, + foreign key (holder) references people (id), + foreign key (against) references people (id) +); diff --git a/Janet/chapter3/set-x-macro.janet b/Janet/chapter3/set-x-macro.janet new file mode 100644 index 0000000..36f2346 --- /dev/null +++ b/Janet/chapter3/set-x-macro.janet @@ -0,0 +1,6 @@ +(defmacro set-x [& expressions] + ~(upscope + ,;(mapcat (fn [expression] + [~(print ,(string/format "about to execute %q" expression)) + expression]) + expressions))) diff --git a/Janet/chapter3/set-x-verbose.janet b/Janet/chapter3/set-x-verbose.janet new file mode 100644 index 0000000..ba74a2a --- /dev/null +++ b/Janet/chapter3/set-x-verbose.janet @@ -0,0 +1,10 @@ +(defmacro set-x [& expressions] + (print "expanding the set-x macro") + (printf " here are my arguments: %q" expressions) + (def result ~(upscope + ,;(mapcat (fn [expression] + [~(print ,(string/format "about to execute %q" expression)) + expression]) + expressions))) + (printf " and i'm going to return: %q" result) + result) diff --git a/Janet/chapter3/set-x.janet b/Janet/chapter3/set-x.janet new file mode 100644 index 0000000..86c440d --- /dev/null +++ b/Janet/chapter3/set-x.janet @@ -0,0 +1,6 @@ +(defn set-x [& expressions] + ~(upscope + ,;(mapcat (fn [expression] + [~(print ,(string/format "about to execute %q" expression)) + expression]) + expressions))) diff --git a/Janet/flake.lock b/Janet/flake.lock new file mode 100644 index 0000000..69f0993 --- /dev/null +++ b/Janet/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1747790854, + "narHash": "sha256-8TpwOtr0T016HNlVuDcDNq4q+GMKfLStOSwdabrz+rk=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "f0d925b947cca0bbe7f2d25115cbaf021844aba7", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/Janet/flake.nix b/Janet/flake.nix new file mode 100644 index 0000000..ee0a708 --- /dev/null +++ b/Janet/flake.nix @@ -0,0 +1,26 @@ +{ + description = "A Nix-flake-based Janet development environment"; + + inputs = { + nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; + + flake-utils.url = "github:numtide/flake-utils"; + }; + + outputs = { self, nixpkgs, flake-utils }: + flake-utils.lib.eachDefaultSystem (system: + let + inherit (pkgs.lib) optional optionals; + + pkgs = import nixpkgs { inherit system; }; + in + { + devShells.default = pkgs.mkShell { + buildInputs = with pkgs; [ + janet + sqlite + ]; + }; + } + ); +}