Built-in functions
The language comes with lots of built-in functions. The goal is to provide a "batteries included" experience for developers.
Core functions
| Name | Example | Example result | Description |
|---|---|---|---|
| debug | (debug) |
true |
Toggle debug output. Disabled in safe-mode. |
| doc | (doc +) |
"Return the sum of all arguments." |
Show the documentation string for a function. |
(doc myfn "Documentation string.") |
"Documentation string." |
Set the documentation string for a function. | |
| eval | (eval '(+ 1 2 3)) |
6 |
Evaluate the given argument. This is actually a special form, not a function. |
| exit | (exit 1) |
Terminate the script with given exit code using exit. Disabled in safe-mode. | |
(print "hello world") |
hello world |
Print expression on the screen. Disabled in safe-mode. | |
| printr | (printr "hello world") |
"hello world" |
Print expression on the screen in readable format. Disabled in safe-mode. |
| prints | (prints "hello world") |
"\"hello world\"" |
Print expression to string in readable format. |
| read | (read "(+ 1 2 3)") |
(+ 1 2 3) |
Read a string as code and return the expression. |
| sleep | (sleep 2000) |
null |
Sleep for the given period given in milliseconds using usleep. Disabled in safe-mode. |
| system | (system "ls") |
[0 "file1.txt\nfile2.txt\n"] |
Execute a system command and return a vector where the first item is status code and second is the output of the command as a string. |
| throw | (throw "invalid value") |
error: "invalid value" |
Throw an exception. The given value is passed to catch. See the section Exceptions. |
Collection functions
| Name | Example | Example result | Description |
|---|---|---|---|
| hash | (hash "a" 1 "b" 2) |
{"a":1 "b":2} |
Create a new hash-map. |
| list | (list 1 2 3) |
(1 2 3) |
Create a new list. |
| vector | (vector 1 2 3) |
[1 2 3] |
Create a new vector. |
| range | (range 2 5) |
[2 3 4] |
Create a vector with integer values from first to argument (inclusive) to second argument (exclusive). |
| range | (range 5) |
[0 1 2 3 4] |
Range can also be used with one argument in which case it is used as length for a vector of integers starting from 0. |
| ltov | (ltov '(1 2 3)) |
[1 2 3] |
Convert list to vector. |
| vtol | (vtol [1 2 3]) |
(1 2 3) |
Convert vector to list. |
| empty? | (empty? []) |
true |
Return true if collection is empty, otherwise false. |
| get | (get [1 2 3] 0) |
1 |
Return the nth element from a sequence, or the corresponding value for the given key from a hash-map. |
| len | (len [1 2 3]) |
3 |
Return the number of elements in a collection. |
| first | (first [1 2 3 4]) |
1 |
Return the first element of a sequence. Also usable as car. |
| second | (second [1 2 3 4]) |
2 |
Return the second element of a sequence. |
| penult | (penult [1 2 3 4]) |
3 |
Return the second-last element of a sequence. |
| last | (last [1 2 3 4]) |
4 |
Return the last element of a sequence. |
| head | (head [1 2 3 4]) |
[1 2 3] |
Return new sequence which contains all elements except the last. |
| tail | (tail [1 2 3 4]) |
[2 3 4] |
Return new sequence which contains all elements except the first. Also usable as cdr. |
| slice | (slice [1 2 3 4 5] 1 3) |
[2 3 4] |
Return a slice of the sequence using offset and length. Uses array_slice. |
| apply | (apply + 1 2 [3 4]) |
10 |
Call the first argument using a sequence as argument list. Intervening arguments are prepended to the list. |
| chunk | (chunk [1 2 3 4 5] 2) |
[[1 2] [3 4] [5]] |
Divide a sequence to multiple sequences with specified length using array_chunk. |
| concat | (concat [1 2] '(3 4)) |
(1 2 3 4) |
Concatenate multiple sequences together and return them as a list. |
| push | (push [1 2] 3 4) |
[1 2 3 4] |
Create new sequence by inserting arguments at the end. |
| cons | (cons 1 2 [3 4]) |
[1 2 3 4] |
Create new sequence by inserting arguments at the beginning. |
| map | (map (fn (a) (* a 2)) [1 2 3]) |
[2 4 6] |
Create new sequence by calling a function for each item. Uses array_map internally. |
| map2 | (map2 + [1 2 3] [4 5 6]) |
[5 7 9] |
Create new sequence by calling a function for each item from both sequences. |
| reduce | (reduce + [2 3 4] 1) |
10 |
Reduce a sequence to a single value by calling a function sequentially of all arguments. Optional third argument is used to give the initial value for first iteration. Uses array_reduce internally. |
| filter | (filter odd? [1 2 3 4 5]) |
[1 3 5] |
Create a new sequence by using the given function as a filter. Uses array_filter internally. |
| filterh | (filterh (fn (v k) (prefix? k "a")) {"aa":1 "ab":2 "bb":3}) |
{"aa":1 "ab":2} |
Same as filter but for hash-maps. First argument passed to the callback is the value and second is the key. |
| reverse | (reverse [1 2 3]) |
[3 2 1] |
Reverse the order of a sequence. Uses array_reverse internally. |
| key? | (key? {"a" "b"} "a") |
true |
Return true if the hash-map contains the given key. |
| set | (set {"a" 1} "b" 2) |
{"a":1 "b":2} |
Create new hash-map which contains the given key-value pair. |
| set! | (set! {"a" 1} "b" 2) |
2 |
Modify the given hash-map by setting the given key-value pair and return the set value. This function is mutable! |
| unset | (unset {"a":1 "b":2 "c":3} "b") |
{"a":1 "c":3} |
Create a new hash-map with the given key removed. |
| unset! | (unset! {"a":1 "b":2 "c":3} "b") |
2 |
Modify the given hash-map by removing the given key and return the corresponding value. This function is mutable! |
| keys | (keys {"a" 1 "b" 2}) |
("a" "b") |
Return a list of the keys for a hash-map. |
| values | (values {"a" 1 "b" 2}) |
(1 2) |
Return a list of the values for a hash-map. |
| zip | (zip ["a" "b"] [1 2]) |
{"a":1 "b":2} |
Create a hash-map using the first sequence as keys and the second as values. Uses array_combine internally. |
| sort | (sort [6 4 8 1]) |
[1 4 6 8] |
Sort the sequence using sort. |
| usort | (usort (fn (a b) (if (< a b) 0 1)) [3 1 5 4 2]) |
[1 2 3 4 5] |
Sort the sequence using custom comparison function using usort. |
Comparison functions
| Name | Example | Example result | Description |
|---|---|---|---|
| = | (= 1 "1") |
true |
Compare arguments for equality using the == operator in PHP. |
| == | (== 1 "1") |
false |
Compare arguments for strict equality using the === operator in PHP. |
| != | (!= 1 "1") |
false |
Compare arguments for not-equality using the != operator in PHP. |
| !== | (!== 1 "1") |
true |
Compare arguments for strict not-equality using the !== operator in PHP. |
| < | (< 1 2) |
true |
Return true if first argument is less than second. |
| <= | (<= 1 2) |
true |
Return true if first argument is less or equal to second. |
| > | (> 1 2) |
false |
Return true if first argument is greater than second. |
| >= | (>= 1 2) |
false |
Return true if first argument is greater or equal to second. |
Crypto and hash functions
| Name | Example | Example result | Description |
|---|---|---|---|
| md5 | (md5 "test") |
"098f6b..." |
Calculate the MD5 hash of a string. |
| sha1 | (sha1 "test") |
"a94a8f..." |
Calculate the SHA1 hash of a string. |
| pw-hash | (pw-hash "test") |
"$2y$10$..." |
Calculate the hash for a password using password_hash. |
| pw-verify | (pw-verify "test" "hash") |
false |
Verify a password hash using password_verify. |
Database functions
This is a simple wrapper for PDO. This library is disabled in safe-mode.
| Name | Example | Example result | Description |
|---|---|---|---|
| db-open | (def d (db-open "mysql:host=localhost;dbname=test" "testuser" "testpw")) |
<object<PDO>> |
Open a database connection. |
| db-execute | (db-execute d "INSERT INTO test_table (col1, col2) values (?, ?)" [1 2]) |
1 |
Execute a SQL statement and return the number of affected rows. |
| db-query | (db-query d "SELECT * FROM test_table WHERE col1 = ?" [1]) |
Execute a SELECT statement. | |
| db-last-id | (db-last-id d) |
"1" |
Return the last id of auto-increment column. |
| db-trans | (db-trans d) |
true |
Start a transaction. |
| db-commit | (db-commit d) |
true |
Commit a transaction. |
| db-rollback | (db-rollback d) |
true |
Roll back a transaction. |
Encoding and decoding functions
All of these functions take a single string as argument.
| Name | Description |
|---|---|
| bin2hex | Convert binary data to hexadecimal representation. |
| hex2bin | Decode a hexadecimally encoded binary string. |
| to-base64 | Encode binary data to Base64 representation. |
| from-base64 | Decode a Base64 encoded binary string. |
| url-encode | Encode special characters in URL. |
| url-decode | Decode special characters in URL. |
| utf8-encode | Encode ISO-8859-1 string to UTF-8. |
| utf8-decode | Decode UTF-8 string to ISO-8859-1. |
Http functions
This is a simple wrapper for cURL. This library is disabled in safe-mode.
| Name | Example | Example result | Description |
|---|---|---|---|
| http | (http "POST" "http://example.com/" (to-json {"key":"value"}) {"Content-Type":"application/json"}) |
{"status":200 "body":"" "headers":{}} |
Perform a HTTP request. First argument is the HTTP method, second is URL, third is request body and fourth is headers as a hash-map. The function returns a hash-map which contains keys status, body and headers. |
IO functions
This library is disabled in safe-mode.
| Name | Example | Example result | Description |
|---|---|---|---|
| wd | (wd) |
"/home/user/madlisp/" |
Get the current working directory. |
| chdir | (chdir "/tmp") |
true |
Change the current working directory. |
| file? | (file? "test.txt") |
true |
Return true if the file exists. |
| dir? | (dir? "test.txt") |
false |
Return true if directory exists and is not a file. |
| fsize | (fsize "test.txt") |
4 |
Return the size of a file in bytes. |
| ftime | (ftime "test.txt") |
1608539455 |
Return the modification time of a file as Unix timestamp. |
| ftouch | (ftouch "test.txt") |
true |
Update the modification time of a file. |
| fperms | (fperms "test.txt") |
"0644" |
Get the file permissions of a file. |
| fmod | (fmod "test.txt" "0666") |
true |
Set the file permissions of a file. |
| fown | (fown "test.txt") |
"user" |
Get the owner of a file. |
| fgrp | (fgrp "test.txt") |
"group" |
Get the group of a file. |
| fcache | (fcache) |
null |
Clear the cache of file information (permissions, modification time, size) using clearstatcache. |
| fdel | (fdel "test.txt") |
true |
Delete a file. |
| fget | (fget "test.txt") |
"content" |
Read the contents of a file using file_get_contents. |
| fput | (fput "test.txt" "content") |
true |
Write string to file using file_put_contents. Give optional third parameter as true to append. |
| fopen | (def f (fopen "test.txt" "w")) |
<resource> |
Open a file for reading or writing. Give the mode as second argument. |
| fclose | (fclose f) |
true |
Close a file resource. |
| fwrite | (fwrite f "abc") |
3 |
Write to a file resource. |
| fflush | (fflush f) |
true |
Persist buffered writes to disk for a file resource. |
| fread | (fread f 16) |
"abc" |
Read from a file resource. |
| feof? | (feof? f) |
true |
Return true if end of file has been reached for a file resource. |
| glob | (glob "src/*.php") |
["src/a.php" "src/b.php"] |
Find all files matching the given pattern. |
| read-dir | (read-dir "txt") |
["." ".." "a.txt" "b.txt"] |
List all files from a directory. |
The following functions are available if the readline extension is loaded:
| Name | Example | Example result | Description |
|---|---|---|---|
| readline | (readline "What is your name? ") |
What is your name? |
Read line of user input using readline. |
| readline-add | (readline-add "What is your name? ") |
true |
Add line of user input to readline history using readline_add_history. |
| readline-load | (readline-load "historyfile") |
true |
Read readline history from file using readline_read_history. |
| readline-save | (readline-save "historyfile") |
true |
Write readline history into file using readline_write_history. |
Json functions
| Name | Example | Example result | Description |
|---|---|---|---|
| to-json | (to-json { "a" [1 2 3] "b" [4 5 6] }) |
"{\"a\":[1,2,3],\"b\":[4,5,6]}" |
Encode the argument as a JSON string. |
| from-json | (from-json "{\"a\":[1,2,3],\"b\":[4,5,6]}") |
{"a":[1 2 3] "b":[4 5 6]} |
Decode the JSON string given as argument. |
Math functions
| Name | Example | Example result | Description |
|---|---|---|---|
| + | (+ 1 2 3) |
6 |
Return the sum of the arguments. |
| - | (- 4 2 1) |
1 |
Subtract the other arguments from the first. |
| * | (* 2 3 4) |
24 |
Multiply the arguments. |
| / | (/ 7 2) |
3.5 |
Divide the arguments. |
| // | (// 7 2) |
3 |
Divide the arguments using integer division. |
| % | (% 6 4) |
2 |
Calculate the modulo. |
| inc | (inc 1) |
2 |
Increment the argument by one. |
| dec | (dec 2) |
1 |
Decrement the argument by one. |
| sin | (sin 1) |
0.84 |
Calculate the sine. |
| cos | (cos 1) |
0.54 |
Calculate the cosine. |
| tan | (tan 1) |
1.55 |
Calculate the tangent. |
| abs | (abs -2) |
2 |
Get the absolute value. |
| floor | (floor 2.5) |
2 |
Get the next lowest integer. |
| ceil | (ceil 2.5) |
3 |
Get the next highest integer. |
| max | (max 3 6 4) |
6 |
Return the largest value. |
| max | (max [3 6 4]) |
6 |
Max can also be used with a sequence. |
| min | (min 4 2 5) |
2 |
Return the smallest value. |
| min | (min [4 2 5]) |
2 |
Min can also be used with a sequence. |
| pow | (pow 2 4) |
16 |
Raise the first argument to the power of the second argument. |
| sqrt | (sqrt 2) |
1.41 |
Calculate the square root. |
| rand | (rand 5 10) |
8 |
Return a random integer between given min and max values. |
| randf | (randf) |
0.678 |
Return a random float between 0 (inclusive) and 1 (exclusive). |
| rand-seed | (rand-seed 256) |
256 |
Seed the random number generator with the given value. |
| rand-bytes | (rand-bytes 4) |
"abcd" |
Get random binary data of the given length. |
Regular expression functions
| Name | Example | Example result | Description |
|---|---|---|---|
| re-match | (re-match "/^[a-z]{4}[0-9]{4}$/" "test1234") |
true |
Match subject to regular expression using preg_match. |
(re-match "/[a-z]{5}/" "one three five" true) |
"three" |
Give true as third argument to return the matched text. | |
| re-match-all | (re-match-all "/[A-Z][a-z]{2}[0-9]/" "One1 Two2 Three3") |
["One1" "Two2"] |
Find multiple matches to regular expression using preg_match_all. |
| re-replace | (re-replace "/year ([0-9]{4}) month ([0-9]{2})/" "$1-$2-01" "year 2020 month 10") |
"2020-10-01" |
Perform search and replace with regular expression using preg_replace. |
| re-split | (re-split "/\\s+/" "aa bb cc ") |
["aa" "bb" "cc"] |
Split the subject by regular expression using preg_split. The flag PREG_SPLIT_NO_EMPTY is enabled. |
String functions
| Name | Example | Example result | Description |
|---|---|---|---|
| empty? | (empty? "") |
true |
Return true if argument is empty string. |
| len | (len "hello world") |
11 |
Return the length of a string using strlen. |
| reverse | (reverse "hello world") |
"dlrow olleh" |
Reverse the characters of a string using strrev. |
| trim | (trim " abc ") |
"abc" |
Trim the string using trim. |
| ltrim | (ltrim " abc ") |
"abc " |
Trim the beginning of string using ltrim. |
| rtrim | (rtrim " abc ") |
" abc" |
Trim the end of string using rtrim. |
| upcase | (upcase "abc") |
"ABC" |
Make the string upper case using strtoupper. |
| lowcase | (lowcase "Abc") |
"abc" |
Make the string lower case using strtolower. |
| strpos | (strpos "hello world" "llo") |
2 |
Return the index of the second string in the first string, or false if not found, using strpos. |
| stripos | (stripos "hello world" "LLO") |
2 |
Case-insensitive version of strpos. |
| substr | (substr "hello world" 3 5) |
"lo wo" |
Get a substring using substr. |
| replace | (replace "hello world" "hello" "bye") |
"bye world" |
Replace substrings using str_replace. |
| split | (split "-" "a-b-c") |
["a" "b" "c"] |
Split string using explode. |
| join | (join "-" "a" "b" "c") |
"a-b-c" |
Join string together using implode. |
| format | (format "%d %.2f" 56 4.5) |
"56 4.50" |
Format string using sprintf. |
| prefix? | (prefix? "hello world" "hello") |
true |
Return true if the first argument starts with the second argument. |
| suffix? | (suffix? "hello world" "world") |
true |
Return true if the first argument ends with the second argument. |
| strcmp | Compare two strings using strcmp. | ||
| strcasecmp | Compare two strings using strcasecmp. | ||
| strnatcmp | Compare two strings using strnatcmp. | ||
| strnatcasecmp | Compare two strings using strnatcasecmp. |
The following functions are available if the mbstring extension is loaded:
| Name | Description |
|---|---|
| mb-len | Return the length of a multibyte string in characters. |
| mb-upcase | Multibyte version of upcase. |
| mb-lowcase | Multibyte version of lowcase. |
| mb-strpos | Multibyte version of strpos. |
| mb-stripos | Multibyte version of stripos. |
| mb-substr | Multibyte version of substr. |
Time functions
| Name | Example | Example result | Description |
|---|---|---|---|
| time | (time) |
1592011969 |
Return the current unix timestamp using time. |
| mtime | (mtime) |
1607696761.132 |
Return the current unix timestamp as float that includes microseconds. Uses microtime. |
| date | (date "Y-m-d H:i:s") |
"2020-06-13 08:33:29" |
Format the current time and date using date. |
| strtotime | (strtotime "2020-06-13 08:34:47") |
1592012087 |
Parse datetime string into unix timestamp using strtotime. |
Type functions
Skipped examples here as these are pretty self-explanatory.
| Name | Description |
|---|---|
| bool | Convert the argument to boolean. |
| float | Convert the argument to floating-point value. |
| int | Convert the argument to integer. |
| str | Convert the argument to string. Also concatenate multiple strings together. |
| symbol | Convert the argument to symbol. |
| not | Turns true to false and vice versa. |
| type | Return the type of the argument as a string. |
| fn? | Return true if the argument is a function. |
| macro? | Return true if the argument is a macro. |
| list? | Return true if the argument is a list. |
| vector? | Return true if the argument is a vector. |
| seq? | Return true if the argument is a sequence (list or vector). |
| hash? | Return true if the argument is a hash-map. |
| symbol? | Return true if the argument is a symbol. |
| object? | Return true if the argument is an object. |
| resource? | Return true if the argument is a resource. |
| bool? | Return true if the argument is a boolean value (strict comparison). |
| true? | Return true if the argument evaluates to true (non-strict comparison). |
| false? | Return true if the argument evaluates to false (non-strict comparison). |
| null? | Return true if the argument is null (strict comparison). |
| int? | Return true if the argument is an integer. |
| float? | Return true if the argument is a floating-point value. |
| str? | Return true if the argument is a string. |
| zero? | Return true if the argument is integer 0 (strict comparison). |
| one? | Return true if the argument is integer 1 (strict comparison). |
| even? | Return true if the argument is even number (0, 2, 4, ...). |
| odd? | Return true if the argument is odd number (1, 3, 5, ...). |