From ec7a0dc95f68f0a3b3a79d292596da26e3b8f467 Mon Sep 17 00:00:00 2001
From: Přemysl Janouch
Date: Fri, 26 May 2017 01:36:43 +0200
Subject: Add "values"
This oneliner is way too important to be left out.
---
README.adoc | 12 ++++++++----
ell.c | 5 +++++
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/README.adoc b/README.adoc
index 792429d..2473802 100644
--- a/README.adoc
+++ b/README.adoc
@@ -32,17 +32,17 @@ The parser, however, does a bunch of transformations:
As an example, consider the following snippet:
print (if { eq? @var foo } {
- quote 'Hello world\n'
+ values 'Hello world\n'
} else {
- quote 'Error\n'
+ values 'Error\n'
})
which gets expanded to the following:
((print (if (quote ((eq? (set var) foo)))
- (quote ((quote 'Hello world\n')))
+ (quote ((values 'Hello world\n')))
else
- (quote ((quote 'Error\n'))))))
+ (quote ((values 'Error\n'))))))
Observe that the whole program is enclosed in an implicit pair of `{}` and that
`quote` is a very powerful special form which can replace many others if needed.
@@ -85,6 +85,10 @@ Retrieve or set a named variable. The syntax sugar for retrieval is `@`.
Return a list made of given arguments. The syntax sugar for lists is `[]`.
+`values [- ]...`
+
+Return an arbitrary number of values.
+
`if [elif ]... [else ]`
Conditional evaluation, strings evaluate to themselves.
diff --git a/ell.c b/ell.c
index da3fb72..850083c 100644
--- a/ell.c
+++ b/ell.c
@@ -977,6 +977,10 @@ defn (fn_list) {
return check (ctx, (*result = new_list (values)));
}
+defn (fn_values) {
+ return !args || check (ctx, (*result = new_clone_list (args)));
+}
+
defn (fn_if) {
struct item *cond, *body, *keyword;
for (cond = args; ; cond = keyword->next) {
@@ -1280,6 +1284,7 @@ static bool
init_runtime_library (struct context *ctx) {
if (!native_register (ctx, "set", fn_set)
|| !native_register (ctx, "list", fn_list)
+ || !native_register (ctx, "values", fn_values)
|| !native_register (ctx, "if", fn_if)
|| !native_register (ctx, "map", fn_map)
|| !native_register (ctx, "print", fn_print)
--
cgit v1.2.3-70-g09d2