modulepackage
0.0.0-20250223205350-becdc12922f3
Repository: https://github.com/azer0s/hummus.git
Documentation: pkg.go.dev
# README
Getting started
git clone https://github.com/Azer0s/Hummus.git
cd Hummus
Running locally
make all
echo "export PATH=\"$(pwd)/bin:\$PATH"\" >> ~/.bashrc
Creating a Hummus project
hummus init helloworld
cd helloworld
hummus run
Running on docker
docker build -t azer0s/hummus:latest .
docker run --rm -it azer0s/hummus:latest
Or get the edge image:
docker run --rm -it azer0s/hummus:edge
Examples
Variable assignment
(def a "Hello world")
Function assignment
(def square (fn x
(* x x)))
Anonymous function
((fn x (* x x)) 4)
Use function
(out (square 4))
Structs
(use :<base>)
(def Animal (struct
:name
:age
:race
))
(def tom (Animal
"Tom"
1
:cat
))
(out (:name tom) " is a " (` (:race tom))) ; prints Tom is a cat
Parallel processing
(use :<base>)
(use :<pipe/parallel>)
(def square (fn x
(* x x)))
(pipe/parallel-do 4 out square)
Maps
(use :<base>)
(def prices ({}
(:tea :1.5$)
(:coffee :2$)
(:cake :3$)
))
(out "Cake costs " (` (:cake prices)))
(out "Tea costs " (` ([] :tea prices)))
Macros
(def dotimes (macro times |action|
; || tells Hummus to not evaluate this argument but to
; literally take the AstNode as it's input parameter
(map (.. 1 times) (fn _ (identity action)))
))
(dotimes 3 (out "Hello world"))
; Same as writing
; (out "Hello world")
; (out "Hello world")
; (out "Hello world")
(def when (macro |cond| |action|
(' :if cond action)
))
(when (> 4 3) (out "A"))
; same as writing
; (if (> 4 3)
; (out "A"))
Actor model
(use :<base>)
(use :<sync>)
(def ping (fn
(for true
(def msg (receive))
(def type (nth 0 msg))
(def sender (nth 1 msg))
(if (= type :pong)
((fn
(out "PONG")
(sync/sleep 1 :s)
(send sender (list :ping self))
))
(out "Invalid message!")
)
)
))
(def pong (fn
(for true
(def msg (receive))
(def type (nth 0 msg))
(def sender (nth 1 msg))
(if (= type :ping)
((fn
(out "PING")
(sync/sleep 1 :s)
(send sender (list :pong self))
))
(out "Invalid message!")
)
)
))
(def pingPid (spawn ping))
(def pongPid (spawn pong))
(send pongPid (list :ping pingPid))
(in)
Map ⇄ Filter ⇄ Reduce
(use :<base>)
(use :<str>)
(def pilots (list
({}
(:id 2)
(:name "Wedge Antilles")
(:faction "Rebels")
)
({}
(:id 8)
(:name "Ciena Ree")
(:faction "Empire")
)
({}
(:id 40)
(:name "Iden Versio")
(:faction "Empire")
)
({}
(:id 66)
(:name "Thane Kyrell")
(:faction "Rebels")
)
))
(each
(map pilots (fn x
(str/concat (` (:name x)) " => " (` (:faction x)))
))
(fn x
(out x)
))
(each
(filter pilots (fn x
(= (:faction x) "Empire")
))
(fn x
(out (:name x))
))
(out (reduce pilots (fn x acc
(if (= (:faction x) "Empire")
(+ acc 1)
acc
)
) 0))
Function composition
(use :<base>)
(use :<pipe>)
(use :<str>)
(def add (fn a b
(+ a b)
))
(def square(fn x
(* x x)
))
(def add-square-out (|> add square out))
(add-square-out 3 1) ; prints 16
(pipe/do pilots
(map.. (fn x
(str/concat (` (:name x)) " => " (` (:faction x)))
))
(each.. (fn x
(out x)
))
)
(pipe/do pilots
(filter.. (fn x
(= (:faction x) "Empire")
))
(map.. (fn x
(:name x)
))
(each.. (fn x
(out x)
))
)
(pipe/do pilots
(reduce.. (fn x acc
(if (= (:faction x) "Empire")
(+ acc 1)
acc
)
) 0)
out
)
HTTP Server
(use :<base>)
(use :<net/http>)
(http/handle "/" (fn req
(str/concat "<h1> Hello " (:method req) "</h1>")
))
(http/handle "/test" (fn req
"<h1> Test </h1>"
))
(http/serve ":8080")
Examples
(use :<base>)
(use :<str>)
(def fib (fn n
(if (< n 2)
1
(+ (fib (- n 2)) (fib (- n 1)))
)
))
(for (range x (list "Hello" "World"))
(out x)
)
(for (range x (to 10))
(out x)
)
(for true
(out "Hello world")
)
(str/concat "String functions go b" (str/repeat "r" 10))
Get help
(use :<internals>)
(hummus/info-group log)
Exit the application
(exit)
License
Credits
- peterh/liner - used for REPL
- sirupsen/logrus - used in the log stdlib
# Packages
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author
No description provided by the author