Files
2026-03-09 23:09:46 -04:00

368 lines
9.7 KiB
Clojure

(ns clje.core
"CljElixir core — stubs for clj-kondo/clojure-lsp.
These are builtin functions and special forms handled directly by the
CljElixir transformer. Standard Clojure forms (defn, let, fn, if, etc.)
are mapped via :lint-as in .clj-kondo/config.edn."
(:refer-clojure :exclude [case send pr pr-str prn print-str
vec vector subvec vector?
str println cons list
inc dec
map filter concat take drop
sort sort-by group-by frequencies distinct
mapcat partition
keys vals select-keys merge into
get assoc dissoc update get-in assoc-in update-in
count first rest seq
conj nth peek pop
reduce reduce-kv
contains? empty? nil?
not= with-open throw]))
;; ===== Special Forms (hooks handle these) =====
(defmacro receive
"BEAM message receive with pattern matching.
(receive
[:hello sender] (send sender :hi)
[:quit] (System/halt 0)
:after 5000 (println \"timeout\"))"
[& clauses])
(defmacro defmodule
"Defines an Elixir module.
(defmodule MyModule
(defn my-func [x] (* x 2)))"
[name & body])
(defmacro case
"Pattern matching (not constant matching like Clojure).
(case val
[a b] (+ a b)
{:key v} v
_ :default)"
[expr & clauses])
(defmacro with
"Monadic binding — chains pattern matches, short-circuits on mismatch.
(with [{:ok val1} (step1)
{:ok val2} (step2 val1)]
(+ val1 val2))"
[bindings & body])
(defmacro ns
"Declares the module namespace (primary module declaration).
(ns MyApp.Router
(require [Logger])
(use [CljElixir.Core]))"
[name & body])
;; ===== BEAM Concurrency =====
(defn spawn
"Spawns a new BEAM process. Returns PID.
(spawn (fn [] (IO/puts \"hello from new process\")))"
[f])
(defn send
"Sends a message to a process. Returns the message.
(send pid {:hello \"world\"})"
[pid msg])
(defn monitor
"Monitors a process. Returns a reference.
(monitor pid)
(monitor :process pid)"
([pid]) ([type pid]))
(defn link
"Creates a bidirectional link between processes.
(link pid)"
[pid])
(defn unlink
"Removes a link between processes.
(unlink pid)"
[pid])
(defn alive?
"Returns true if the process is alive.
(alive? pid) ;=> true"
[pid])
;; ===== Arithmetic =====
(defn inc
"Increments by 1.
(inc 5) ;=> 6"
[x])
(defn dec
"Decrements by 1.
(dec 5) ;=> 4"
[x])
;; ===== String & Output =====
(defn str
"Concatenates arguments into a string.
(str \"hello\" \" \" \"world\") ;=> \"hello world\""
[& args])
(defn println
"Prints arguments followed by newline.
(println \"hello\")"
[& args])
(defn pr-str
"Returns a string representation (EDN-like).
(pr-str {:a 1}) ;=> \"{:a 1}\""
[& args])
(defn prn
"Prints EDN representation followed by newline."
[& args])
(defn pr
"Prints EDN representation (no newline)."
[& args])
(defn print-str
"Returns a human-readable string."
[& args])
;; ===== BEAM Types & Interop =====
(defn tuple
"Creates a BEAM tuple from arguments.
(tuple :ok \"value\") ;=> #el[:ok \"value\"]"
[& args])
(defn clojurify
"Converts Elixir types to Clojure equivalents (keyword lists → maps, etc.).
(clojurify elixir-val)"
[val])
(defn elixirify
"Converts Clojure types to Elixir equivalents (maps → keyword lists, etc.).
(elixirify clj-val)"
[val])
(defn hd
"Returns the head (first element) of a list.
(hd [1 2 3]) ;=> 1"
[coll])
(defn tl
"Returns the tail (rest) of a list.
(tl [1 2 3]) ;=> [2 3]"
[coll])
(defn cons
"Prepends an element to a list.
(cons 1 [2 3]) ;=> [1 2 3]"
[head tail])
(defn list
"Creates a list from arguments.
(list 1 2 3) ;=> [1 2 3]"
[& args])
;; ===== BEAM Type Guards =====
(defn is-binary
"Returns true if `x` is a binary (string). Allowed in guards.
(is-binary \"hello\") ;=> true"
[x])
(defn is-integer
"Returns true if `x` is an integer. Allowed in guards."
[x])
(defn is-float
"Returns true if `x` is a float. Allowed in guards."
[x])
(defn is-number
"Returns true if `x` is a number. Allowed in guards."
[x])
(defn is-atom
"Returns true if `x` is an atom. Allowed in guards."
[x])
(defn is-list
"Returns true if `x` is a list. Allowed in guards."
[x])
(defn is-map
"Returns true if `x` is a map. Allowed in guards."
[x])
(defn is-tuple
"Returns true if `x` is a tuple. Allowed in guards."
[x])
(defn is-pid
"Returns true if `x` is a PID. Allowed in guards."
[x])
(defn is-boolean
"Returns true if `x` is a boolean. Allowed in guards."
[x])
(defn is-nil
"Returns true if `x` is nil. Allowed in guards."
[x])
(defn is-function
"Returns true if `x` is a function, optionally with given `arity`.
(is-function f) ;=> true
(is-function f 2) ;=> true if f takes 2 args"
([x]) ([x arity]))
;; ===== Vectors =====
(defn vec
"Converts a collection to a PersistentVector.
(vec [1 2 3])"
[coll])
(defn vector
"Creates a PersistentVector from arguments.
(vector 1 2 3)"
[& args])
(defn subvec
"Returns a subvector from `start` to `end`.
(subvec v 1 3)"
([v start]) ([v start end]))
(defn vector?
"Returns true if `x` is a PersistentVector.
(vector? (vector 1 2 3)) ;=> true"
[x])
;; ===== Core Data Operations =====
(defn get
"Gets value at `key` from collection. Returns `default` if missing.
(get {:a 1} :a) ;=> 1
(get {:a 1} :b :not-found) ;=> :not-found"
([coll key]) ([coll key default]))
(defn assoc
"Associates `key` with `val` in collection.
(assoc {:a 1} :b 2) ;=> {:a 1 :b 2}"
[coll key val])
(defn dissoc
"Dissociates `key` from collection.
(dissoc {:a 1 :b 2} :a) ;=> {:b 2}"
[coll key])
(defn update
"Updates value at `key` by applying `f`.
(update {:a 1} :a inc) ;=> {:a 2}"
([coll key f]) ([coll key f & args]))
(defn get-in
"Gets value at nested `path`.
(get-in {:a {:b 1}} [:a :b]) ;=> 1"
([coll path]) ([coll path default]))
(defn assoc-in
"Associates value at nested `path`.
(assoc-in {} [:a :b] 1) ;=> {:a {:b 1}}"
[coll path val])
(defn update-in
"Updates value at nested `path` by applying `f`.
(update-in {:a {:b 1}} [:a :b] inc) ;=> {:a {:b 2}}"
[coll path f])
(defn contains?
"Returns true if `coll` contains `key`.
(contains? {:a 1} :a) ;=> true"
[coll key])
(defn empty?
"Returns true if `coll` is empty.
(empty? []) ;=> true"
[coll])
(defn nil?
"Returns true if `x` is nil.
(nil? nil) ;=> true"
[x])
(defn count
"Returns the number of elements.
(count [1 2 3]) ;=> 3"
[coll])
(defn first
"Returns the first element.
(first [1 2 3]) ;=> 1"
[coll])
(defn rest
"Returns all but the first element.
(rest [1 2 3]) ;=> [2 3]"
[coll])
(defn seq
"Returns a seq on the collection, or nil if empty.
(seq [1 2 3]) ;=> (1 2 3)"
[coll])
(defn conj
"Adds element to collection (position depends on type).
(conj [1 2] 3) ;=> [1 2 3]"
[coll x])
(defn nth
"Returns element at `index`.
(nth [10 20 30] 1) ;=> 20"
([coll index]) ([coll index not-found]))
(defn peek
"Returns the most accessible element.
(peek [1 2 3]) ;=> 3"
[coll])
(defn pop
"Returns collection without the most accessible element.
(pop [1 2 3]) ;=> [1 2]"
[coll])
;; ===== Reducing =====
(defn reduce
"Reduces collection with `f`.
(reduce + [1 2 3]) ;=> 6
(reduce + 0 [1 2 3]) ;=> 6"
([f coll]) ([f init coll]))
(defn reduce-kv
"Reduces a map with `f` receiving (acc, key, value).
(reduce-kv (fn [acc k v] (+ acc v)) 0 {:a 1 :b 2}) ;=> 3"
[f init coll])
;; ===== Sequence Operations =====
(defn map
"Applies `f` to each element, returns a list.
(map inc [1 2 3]) ;=> [2 3 4]"
[f coll])
(defn filter
"Returns elements where `f` returns truthy.
(filter (fn [x] (> x 2)) [1 2 3 4]) ;=> [3 4]"
[f coll])
(defn concat
"Concatenates collections.
(concat [1 2] [3 4]) ;=> [1 2 3 4]"
[& colls])
(defn take
"Returns first `n` elements.
(take 2 [1 2 3 4]) ;=> [1 2]"
[n coll])
(defn drop
"Drops first `n` elements.
(drop 2 [1 2 3 4]) ;=> [3 4]"
[n coll])
(defn sort
"Sorts a collection.
(sort [3 1 2]) ;=> [1 2 3]
(sort > [3 1 2]) ;=> [3 2 1]"
([coll]) ([comp coll]))
(defn sort-by
"Sorts by the result of `keyfn`.
(sort-by :name [{:name \"b\"} {:name \"a\"}])"
([keyfn coll]) ([keyfn comp coll]))
(defn group-by
"Groups elements by the result of `f`.
(group-by even? [1 2 3 4]) ;=> {false [1 3] true [2 4]}"
[f coll])
(defn frequencies
"Returns a map of element → count.
(frequencies [:a :b :a]) ;=> {:a 2 :b 1}"
[coll])
(defn distinct
"Returns unique elements.
(distinct [1 2 1 3]) ;=> [1 2 3]"
[coll])
(defn mapcat
"Maps then concatenates results.
(mapcat (fn [x] [x x]) [1 2 3]) ;=> [1 1 2 2 3 3]"
[f coll])
(defn partition
"Partitions collection into groups of `n`.
(partition 2 [1 2 3 4]) ;=> [[1 2] [3 4]]"
([n coll]) ([n step coll]) ([n step pad coll]))
(defn keys
"Returns keys of a map.
(keys {:a 1 :b 2}) ;=> [:a :b]"
[m])
(defn vals
"Returns values of a map.
(vals {:a 1 :b 2}) ;=> [1 2]"
[m])
(defn select-keys
"Selects only specified `ks` from map.
(select-keys {:a 1 :b 2 :c 3} [:a :c]) ;=> {:a 1 :c 3}"
[m ks])
(defn merge
"Merges maps. Later maps take precedence.
(merge {:a 1} {:b 2}) ;=> {:a 1 :b 2}"
[& maps])
(defn into
"Pours elements from `from` into `to`.
(into {} [[:a 1] [:b 2]]) ;=> {:a 1 :b 2}"
[to from])
(defn not=
"Returns true if arguments are not equal.
(not= 1 2) ;=> true"
[& args])
(defn throw
"Throws a value (caught by try/catch :throw).
(throw :some-error)"
[value])