diff options
-rw-r--r-- | .gitignore | 9 | ||||
-rw-r--r-- | LICENSE | 13 | ||||
-rw-r--r-- | README.adoc | 95 | ||||
-rwxr-xr-x | ell.c | 19 |
4 files changed, 136 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4fdc357 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# Build files +/build + +# Qt Creator files +/CMakeLists.txt.user* +/ell.config +/ell.files +/ell.creator* +/ell.includes @@ -0,0 +1,13 @@ +Copyright (c) 2017, Přemysl Janouch <p.janouch@gmail.com> + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/README.adoc b/README.adoc new file mode 100644 index 0000000..6206715 --- /dev/null +++ b/README.adoc @@ -0,0 +1,95 @@ +ell +=== +:compact-option: + +'ell' is a modified subset of Scheme with added syntax sugar, incorporating +ideas from Perl, Tcl and Bourne shell. The goal was to conceive a programming +language implementable with as little code as possible while still being +reasonably comfortable to use. + +This package is an implementation of said language, meant to be self-contained, +portable and reusable. Performance is specifically not an intent. + +Syntax +------ +Owing to its Scheme heritage, 'ell' is homoiconic, that is a program can be +directly expressed using the language's data types. There are only two of +those: the list and the string. Any numerical conversions are made on an +as-needed basis. Similarly, strings act like atoms/symbols when executed. + +The parser, however, does a bunch of transformations: + + * `[a b c]` makes a call to `(list a b c)`; + * `@var` is a shorthand for `(set var)`; + * `{ code }` is the most complex one. Each line within the curly braces is + wrapped in parentheses, and the resulting list is quoted, so that it doesn't + execute immediately. + +As an example, consider the following snippet: + + print (if { = @var foo } { + quote 'Hello world\n' + } else { + quote 'Error\n' + }) + +which gets expanded to the following: + + ((print (if (quote ((= (set var) foo))) + (quote ((quote 'Hello world\n'))) + else + (quote ((quote '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. + +Runtime +------- +All variables are put in a single global namespace with no further scoping. +When calling a command (which is a list of lists), all arguments are +automatically stored in variables named 1, 2, 3, ... n. They are however +effectively inaccessible and you must rename them first using the `arg` special +form. + +When evaluating a command, the first argument is typically a string with its +name and it is resolved as if `set` was called on it. + +The last expression in a block is the return value. + +Special forms +------------- +`quote <arg>` + +Returns the first argument. + +`arg <name>...` + +Reassigns arguments to the current call in order to given names. This must be a +special form because of the lack of variable scoping. It needs to see arguments +from the other scope. + +Standard library +---------------- +`if <cond> <body> [elif <cond> <body>]... [else <body>]` + +Conditional evaluation, strings evaluate to themselves. + +`funargs` + +Returns arguments to the current evaluation context as a list. + +Contributing and Support +------------------------ +Use this project's GitHub to report any bugs, request features, or submit pull +requests. If you want to discuss this project, or maybe just hang out with +the developer, feel free to join me at irc://irc.janouch.name, channel #dev. + +License +------- +'ell' is written by Přemysl Janouch <p.janouch@gmail.com>. + +You may use the software under the terms of the ISC license, the text of which +is included within the package, or, at your option, you may relicense the work +under the MIT or the Modified BSD License, as listed at the following site: + +http://www.gnu.org/licenses/license-list.html @@ -1,3 +1,22 @@ +/* + * ell.c: an experimental little language + * + * Copyright (c) 2017, Přemysl Janouch <p.janouch@gmail.com> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + #define _XOPEN_SOURCE 500 #include <stdio.h> |