|
|
|
@@ -1,11 +1,516 @@ |
|
|
|
#+title: The Slime 1.0 Manual |
|
|
|
|
|
|
|
#+begin_abstract |
|
|
|
sad |
|
|
|
abstract |
|
|
|
#+end_abstract |
|
|
|
|
|
|
|
\tableofcontents |
|
|
|
|
|
|
|
* Lisp languages |
|
|
|
Lisp is not one language but rather a family of programming languages. The family is devided by some |
|
|
|
characteristics. There are Lisp-1 and Lisp-2 dialects and there is a difference between a Lisp with |
|
|
|
lexical scoping as opposed to dynamic scoping. These differences will be explained in later |
|
|
|
sections. |
|
|
|
|
|
|
|
The Lisp language family is known to be highly flexible and applicable in all areas by creating |
|
|
|
domain specific languages in Lisp itself through a powerful macro system. The central data structure |
|
|
|
in Lisp is the list. The reason why lisp is so powerful is because the program source code itself is |
|
|
|
represented as lists. The nested lists make up the syntax tree of the lisp program. It is therfore |
|
|
|
computationally easy to parse lisp programs as the source code itself is already structured in the |
|
|
|
form of the syntax tree; allowing for parsing in linear time. |
|
|
|
|
|
|
|
The macro system in Slime works by recognizing macros at parse-time and running them, and replacing |
|
|
|
the macro call in the program code with the return value of the macro and then checking if further |
|
|
|
macros have to be expanded in the replaced code. Therefore the macros can be used to pre-compute |
|
|
|
values or rewrite expressions (creating syntactic sugar) or themselves define macros. |
|
|
|
|
|
|
|
* Lists |
|
|
|
As mentioned in [[Lisp languages]], the central data structure in all Lisps is the list. Lists are |
|
|
|
implemented as singly linked lists, made up of pairs (historically called =cons-cells=), each pair |
|
|
|
has two slots, the =first= and the =rest= (historically =car= and =cdr=). A linked lsit ist then |
|
|
|
constructed by the convention that the =first= field of a pair points to the first element of the |
|
|
|
list and the =rest= field points to the rest of the list. Following this description, the list is a |
|
|
|
recursive data structure. For the end of the list a special value =nil= is used in the =rest= field. |
|
|
|
|
|
|
|
A helpful way to visualize lists made up of pairs is using box diagrams. A simple box diagram can be |
|
|
|
seen in [[simpleBoxDiagram]]. Each rectangle is divided in two. The left part represents the =first= |
|
|
|
field, the right part represents the =rest=. The arrows point to the values in these fields. |
|
|
|
|
|
|
|
The diagram in [[simpleBoxDiagram]] shows a simple list containing the values 1, 2 and 3. The first pair |
|
|
|
stores the number 1 its =first= field and the =rest= points to the rest of the list. The last pair |
|
|
|
points to the special value =nil= in its =rest= to denote the end of the list. |
|
|
|
|
|
|
|
{{{ditaa_header}}} |
|
|
|
#+begin_src ditaa :file diagrams/list123.eps |
|
|
|
+-----+-----+ +-----+-----+ +-----+-----+ |
|
|
|
| | | | | | | | | |
|
|
|
| | |--->| | |--->| | / | |
|
|
|
| | | | | | | | | |
|
|
|
+-----+-----+ +-----+-----+ +-----+-----+ |
|
|
|
| | | |
|
|
|
| | | |
|
|
|
V V V |
|
|
|
1 2 3 |
|
|
|
#+end_src |
|
|
|
|
|
|
|
#+name: simpleBoxDiagram |
|
|
|
#+caption: Box diagram showing the internal structure of a list containing the values 1, 2 and 3 |
|
|
|
#+RESULTS: |
|
|
|
[[file:diagrams/list123.esp]] |
|
|
|
|
|
|
|
|
|
|
|
However the =rest= of a pair needs not to be a pair or nil, it could also point to any other value. |
|
|
|
By doing this the list is no longer "well formed" but rather "ill formed". Ill formed lsits can be |
|
|
|
used as an optimization when using the list for storing data. In [[illFormedList]] an ill formed list |
|
|
|
can be seen, that also contains the values 1, 2 and 3 but stores them using only two pairs instead |
|
|
|
of 3. |
|
|
|
|
|
|
|
{{{ditaa_header}}} |
|
|
|
#+begin_src ditaa :file diagrams/list12.3.eps |
|
|
|
+-----+-----+ +-----+-----+ |
|
|
|
| | | | | | |
|
|
|
| | |--->| | |--->3 |
|
|
|
| | | | | | |
|
|
|
+-----+-----+ +-----+-----+ |
|
|
|
| | |
|
|
|
| | |
|
|
|
V V |
|
|
|
1 2 |
|
|
|
#+end_src |
|
|
|
|
|
|
|
#+name: illFormedList |
|
|
|
#+caption: The internal structure of an ill formed list where the last pair points to the value 3 |
|
|
|
#+RESULTS: |
|
|
|
[[file:diagrams/list12.3.eps]] |
|
|
|
|
|
|
|
** representing lists in Lisp |
|
|
|
|
|
|
|
In Slime and in most Lisps, lists are represented using round parenthesis where =(= denotes the |
|
|
|
start of the list and =)= denotes the end. Eeach element inside these parenthesis separated by one |
|
|
|
or more spaces will be interpreted as an element of that list. For example the list from |
|
|
|
[[simpleBoxDiagram]] would be represented as =(1 2 3)=. During parse time, the Lisp parser transforms |
|
|
|
the parenthesised list into the pairs that are in the end stored in memory. |
|
|
|
|
|
|
|
To also be able to represent ill formed lists in Lisp there is a special syntax using the =.= (dot |
|
|
|
symbol). If the parser encounters a =.= inside of a list, it will treat the next element as the |
|
|
|
=rest=. If there is no or more than one element after the =.= an parsing error will be thrown. Using |
|
|
|
this syntax we can represent the ill formed list from [[illFormedList]] as =(1 2 . 3)=. We can also |
|
|
|
write well formed lists using the dot notation if we point the rest to another list. So the well |
|
|
|
formed list from [[simpleBoxDiagram]] can also be written as =(1 . (2 . (3)))= |
|
|
|
|
|
|
|
** representing function calls in Lisp |
|
|
|
|
|
|
|
If we tried to enter the Lisp representation of the lists like =(1 2 3)= discussed in [[representing |
|
|
|
lists in Lisp]] directly into an Lisp interpreter we would get an error. That doesn't mean that the |
|
|
|
explanation given in the section is wrong, it is in fact correct: the lisp parser will transform the |
|
|
|
lisp syntax into the pairs in memory. The reason we would get an error is, that when reading Lisp |
|
|
|
code, the Lisp interpreter first parses the code and then tries to evaluate it and return the result |
|
|
|
back to the user. |
|
|
|
|
|
|
|
In Lisp by default, a list corresponds to a function call. As mentioned in [[Lisp languages]] Lisp |
|
|
|
represents lists and Lisp programms as lists. If a list is treated as a function call, the first |
|
|
|
element will be treated as the function and the rest of the elements will be the arguments to that |
|
|
|
function. If we would wnter =(1 2 3)= directly into the Lisp interpreter we would get an error |
|
|
|
saying it cannot find the function =1=. |
|
|
|
|
|
|
|
If we would want to compute the sum of the numbers 5 and 3 we could do this by invoking the =+= |
|
|
|
function with 5 and 3 as its arguments. =(+ 5 3)= will evaluate to 8. We can also nest functions |
|
|
|
calls and use the return values as parameters to other functions: =(+ (- 12 4) (/ 24 4))= will |
|
|
|
evaluate to 14. The box diagramm showing the internal structure of that computation can be seen in |
|
|
|
[[moreComplexBoxDiagram]]. |
|
|
|
|
|
|
|
{{{ditaa_header}}} |
|
|
|
#+begin_src ditaa :file diagrams/simpleMath.eps |
|
|
|
+-----+-----+ +-----+-----+ +-----+-----+ |
|
|
|
| | | | | | | | | |
|
|
|
| | |--->| | |--------------------------------------->| | / | |
|
|
|
| | | | | | | | | |
|
|
|
+-----+-----+ +-----+-----+ +-----+-----+ |
|
|
|
| | | |
|
|
|
| | | |
|
|
|
V V V |
|
|
|
+ +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ |
|
|
|
| | | | | | | | | | | | | | | | | | |
|
|
|
| | |--->| | |--->| | / | | | |--->| | |--->| | / | |
|
|
|
| | | | | | | | | | | | | | | | | | |
|
|
|
+-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ |
|
|
|
| | | | | | |
|
|
|
| | | | | | |
|
|
|
V V V V V V |
|
|
|
- 12 4 / 24 4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#+end_src |
|
|
|
|
|
|
|
#+name: moreComplexBoxDiagram |
|
|
|
#+caption: The internal structure of the expression =(+ (- 12 4) (/ 24 4))= |
|
|
|
#+RESULTS: |
|
|
|
[[file:diagrams/simpleMath.eps]] |
|
|
|
|
|
|
|
* Evaluation order |
|
|
|
As a first step of evaluation of a regular function, all its arguments are getting evaluated, and |
|
|
|
then the function is applied to the evaluated arguments. For example when evaluating the nested |
|
|
|
expression in [[code:complex-math]] the outermost function is the =+= function with three arguments: =(* |
|
|
|
3 4)=, =(- 100 (+ 12 13 14 15))= and =2=. So before the outhermost =+= gets invoked, the three |
|
|
|
arguments are getting evaluated recursively. |
|
|
|
|
|
|
|
{{{slime_header}}} |
|
|
|
#+name: code:complex-math |
|
|
|
#+caption: A more complex nested arithmetic expression. Nested expressions can be written more |
|
|
|
#+caption: readable by aligning subsequent arguments vertically underneeth each other |
|
|
|
#+begin_src slime |
|
|
|
(print (+ (* 3 4) |
|
|
|
(- 100 (+ 12 13 14 15)) |
|
|
|
2)) |
|
|
|
#+end_src |
|
|
|
|
|
|
|
#+RESULTS: code:complex-math |
|
|
|
: evaluates to => |
|
|
|
: 60 |
|
|
|
|
|
|
|
** Special forms |
|
|
|
The given evaluation rule -- to evaluate all the arguments first and then allpying them to the |
|
|
|
funciton -- as described in [[Evaluation order]] is only valid for regular functions. There is a class |
|
|
|
of functions that do not follow this evaluation rule called *special forms*. Special forms are |
|
|
|
needed when you do not wish to evaluate all arguments. For example the built-in =if= function should |
|
|
|
only evaluate the "then-expression" if the condition evaluates to a truthy value and not otherwise. |
|
|
|
Consider the example in [[code:special-forms]]. The if expression only evaluates the then-expression. If |
|
|
|
the =if= function would follow the evaluation order of regular functions, first all three arguments |
|
|
|
=(< 1 2)=, =(print "I knew it!!\n")= but also =(print "Oh, it is not?!\n")= could get evaluated and |
|
|
|
so both messages would be printed. In the given =if= expression, the condition evaluates to a truthy |
|
|
|
value and only =I knew it!!= will be printed. |
|
|
|
|
|
|
|
{{{slime_header}}} |
|
|
|
#+name: code:special-forms |
|
|
|
#+caption: The =if= function is a special form because it does not evaluate all of its arguments |
|
|
|
#+begin_src slime |
|
|
|
(if (< 1 2) |
|
|
|
(print "I knew it!!\n") |
|
|
|
(print "Oh, it is not?!\n")) |
|
|
|
#+end_src |
|
|
|
|
|
|
|
#+RESULTS: code:special-forms |
|
|
|
: evaluates to => |
|
|
|
: I knew it!! |
|
|
|
|
|
|
|
The programmer can also define their own special forms using =special-lambda= and macros, which will |
|
|
|
be explained later. |
|
|
|
|
|
|
|
* Symbols and keywords |
|
|
|
* Lambdas |
|
|
|
Slime allows for creating anonymous functions called *lambdas*. We did not talk about binding |
|
|
|
variables, we will do this in [[Define]], but we can still use lambdas now. Remember that Lisp |
|
|
|
interpretes the first argument of a list in the source code as a function and the rest as the |
|
|
|
arguments. The =lambda= special form evaluates to a *regular function object* that can then stand in |
|
|
|
the first position of the function call list. The basic syntax for the lambda special form is: |
|
|
|
\[\texttt{(lambda (arg1 arg2 ...) (body1) ...)}\] the first arguemnt to =lambda= is a list of the |
|
|
|
arguments. All the following arguments will be the body of the lambda. They will be executed when |
|
|
|
the lambda is invoked. The return value of a lambda is the value of the last evaluated expression in |
|
|
|
the body. |
|
|
|
|
|
|
|
Probably the simplest function to write as a lambda is the identity function. It takes one argument |
|
|
|
and returns it. The identity lambda and a few other simple examples of lambdas can be seen in |
|
|
|
[[code:simple-lambdas]]. |
|
|
|
|
|
|
|
{{{slime_header}}} |
|
|
|
#+name: code:simple-lambdas |
|
|
|
#+caption: Some simle lambdas |
|
|
|
#+begin_src slime |
|
|
|
(printf ((lambda (x) x) 1)) |
|
|
|
(printf ((lambda (x y) (+ x y)) 3 5)) |
|
|
|
(printf ((lambda (x y z) (list x y z)) 1 2 3)) |
|
|
|
#+end_src |
|
|
|
|
|
|
|
#+RESULTS: code:simple-lambdas |
|
|
|
: evaluates to => |
|
|
|
: 1 |
|
|
|
: 8 |
|
|
|
: (1 2 3) |
|
|
|
|
|
|
|
Additionally Slime lambdas have the possibility to take *optional arguments* in the form of *keyword |
|
|
|
arguemnts* as well as a *rest argument* which allows for accepting any number of arguments. Since |
|
|
|
these concepts are most useful when the function is actually bound to a variable, they will be |
|
|
|
introduced when we learned how to do that in [[Define]]. |
|
|
|
|
|
|
|
** Special lambdas |
|
|
|
The =lambda= special form creates a function object that represents a regular function. So the basic |
|
|
|
evaluation rules count: when the lambda is invoked all it's arguments are evaluated and then the |
|
|
|
lambda is applied to the evaluated arguments. If this is not wanted in some rare cases, the |
|
|
|
programmer also has the possibility to define a special form using =special-lambda=, which, when |
|
|
|
invoked does not evaluare any argument. The programmer has to evaluate the arguments in the body |
|
|
|
themselves using =eval=. The rest of the syntax between =lambda= and =special-lambda= are the same. |
|
|
|
|
|
|
|
{{{slime_header}}} |
|
|
|
#+name: code:special-lambdas |
|
|
|
#+caption: Special lambdas do not evaluate their arguments |
|
|
|
#+begin_src slime |
|
|
|
((lambda (x) (printf x)) (+ 1 2)) |
|
|
|
((special-lambda (x) (printf x)) (+ 1 2)) |
|
|
|
|
|
|
|
;; Special lambdas make it possible to write |
|
|
|
;; code that inspects code |
|
|
|
((special-lambda (expr) |
|
|
|
(printf "The function to be called is" |
|
|
|
(first expr) |
|
|
|
"and the result is" |
|
|
|
(eval expr))) |
|
|
|
(+ 1 2)) |
|
|
|
#+end_src |
|
|
|
|
|
|
|
#+RESULTS: code:special-lambdas |
|
|
|
: evaluates to => |
|
|
|
: 3 |
|
|
|
: (+ 1 2) |
|
|
|
: The function to be called is + and the result is 3. |
|
|
|
|
|
|
|
* Define |
|
|
|
To assign a value to a symbol you can use the =define= built-in special form. The syntax for |
|
|
|
=define= is: \[\texttt{(define symbol value)}\] and some usages can be seen in |
|
|
|
[[code:variable-defines]]. |
|
|
|
|
|
|
|
{{{slime_header}}} |
|
|
|
#+name: code:variable-defines |
|
|
|
#+caption: Simple definition of variables |
|
|
|
#+begin_src slime |
|
|
|
(define var1 1) |
|
|
|
(define var2 "Hello World") |
|
|
|
(define var3 (+ 1 2)) |
|
|
|
|
|
|
|
(printf var1 var2 var3) |
|
|
|
#+end_src |
|
|
|
|
|
|
|
#+RESULTS: code:variable-defines |
|
|
|
: evaluates to => |
|
|
|
: 1 Hello World 3 |
|
|
|
|
|
|
|
** Defining functions |
|
|
|
In [[Lambdas]] we learned how to create function objects using the =lambda= built-in form. Using |
|
|
|
=define= every Lisp Object can be assigned to a symbol making no exception for the function objects. |
|
|
|
In [[code:lambda-defines]] you can see what that would look like. |
|
|
|
|
|
|
|
{{{slime_header}}} |
|
|
|
#+name: code:lambda-defines |
|
|
|
#+caption: Definition of functions using lambdas |
|
|
|
#+begin_src slime |
|
|
|
(define hypothenuse |
|
|
|
(lambda (a b) |
|
|
|
(** (+ (* a a) (* b b)) 0.5))) |
|
|
|
|
|
|
|
(printf (hypothenuse 3 4)) |
|
|
|
#+end_src |
|
|
|
|
|
|
|
#+RESULTS: code:lambda-defines |
|
|
|
: evaluates to => |
|
|
|
: 5 |
|
|
|
|
|
|
|
Since defining functions is so common, there is a syntactic shorthand that does not require to write |
|
|
|
out the whole =lambda= definition. In this case the first argument to the call to =define= is a |
|
|
|
list. The frist element of the list is the name of the function to define and the other elemens are |
|
|
|
the arguments to that function. An example can be seen in [[code:function-defines]]. Note that the |
|
|
|
definition looks like a call to the function we are constructing, making it easier to see what a |
|
|
|
call to that function will look like. |
|
|
|
|
|
|
|
{{{slime_header}}} |
|
|
|
#+name: code:function-defines |
|
|
|
#+caption: Definition of functions using the shorthand syntax of define |
|
|
|
#+begin_src slime |
|
|
|
(define (hypothenuse a b) |
|
|
|
(** (+ (* a a) (* b b)) 0.5)) |
|
|
|
|
|
|
|
(printf (hypothenuse 3 4)) |
|
|
|
#+end_src |
|
|
|
|
|
|
|
#+RESULTS: code:function-defines |
|
|
|
: evaluates to => |
|
|
|
: 5 |
|
|
|
|
|
|
|
** Functions with keyword arguments |
|
|
|
A sometimes more convenient way of passing arguments to a function is using keyword arguments. Using |
|
|
|
keyword arguments a function call could look like this: \[\texttt{(function :arg1 value1 :arg2 |
|
|
|
value2)}\] here the function accepts two arguments named =arg1= and =arg2=. The user of this |
|
|
|
function can see more clearly excatly which argument will be assigned wich value. This notation also |
|
|
|
allows for switching the argument order. The following function call is equivalent to the call |
|
|
|
above. \[\texttt{(function :arg2 value2 :arg1 value1)}\]. |
|
|
|
|
|
|
|
For this to work however, the function must be defined to accept these keyword arguments. To do this |
|
|
|
the special marker =:keys= has to be inserted into the argument list of a =lambda= or a function |
|
|
|
=define=. All following arguments *must* be supplied as keyword arguments, /unless/ they are also |
|
|
|
supplied with a default value, in which case they do not need to be supplied. To attach a default |
|
|
|
value to a keyword argument, insert =:defaults-to <value>= after the keyword argument name. An |
|
|
|
example of all of this can be seen in [[code:keyword-args]]. |
|
|
|
|
|
|
|
{{{slime_header}}} |
|
|
|
#+name: code:keyword-args |
|
|
|
#+caption: A more complex functoin definition using keyword arguments |
|
|
|
#+begin_src slime |
|
|
|
(define (complex required1 required2 :keys key1 key2 :defaults-to 3 key3) |
|
|
|
(* (+ required1 required2) |
|
|
|
key1 |
|
|
|
key2 |
|
|
|
key3)) |
|
|
|
|
|
|
|
(printf (complex 1 2 :key1 2 :key2 2 :key3 3)) |
|
|
|
(printf (complex 1 2 :key1 2 :key3 3)) |
|
|
|
(printf (complex 1 2 :key3 3 :key1 2)) |
|
|
|
#+end_src |
|
|
|
|
|
|
|
#+RESULTS: code:keyword-args |
|
|
|
: evaluates to => |
|
|
|
: 36 |
|
|
|
: 54 |
|
|
|
: 54 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
** Functions with rest arguments |
|
|
|
|
|
|
|
* Environments |
|
|
|
* Built-in functions |
|
|
|
This section provides a comprehensive list of the built in functions for Slime. Some of them are |
|
|
|
defined in =C++= source code, some are themselves written in Slime. The cool thing about Slime is |
|
|
|
that it is really easy to extend and adapt it for many purposes by writing new functions in =C++= |
|
|
|
that for example communicate with an already existing software system, so Slime can be used as an |
|
|
|
embedded scripting language. |
|
|
|
|
|
|
|
** Arithmetic functions |
|
|
|
- =+= :: (=regular function [C++]=) Takes 0 or more numbers as arguments and returns the sum of all |
|
|
|
the numbers. |
|
|
|
- =-= :: (=regular function [C++]=) Takes 0 or more numbers as arguments. If only one number is |
|
|
|
supplied, its negation is returned, otherwise the difference of the first argument and the |
|
|
|
sum of the remaining arguments is returned: |
|
|
|
\[\texttt{(- 10 2 1)} \Rightarrow 10 - 2 - 1 = 10 - (2 + 1) = 7\] |
|
|
|
- =*= :: (=regular function [C++]=) Takes 0 or more numbers as arguments and returns the product of |
|
|
|
all the numbers. |
|
|
|
- =/= :: (=regular function [C++]=) Takes 0 or more numbers as arguments. If only one number is |
|
|
|
supplied, it is returned, otherwise the quotient of the first argument and the product of |
|
|
|
the remaining arguments is returned: |
|
|
|
\[\texttt{(/ 100 2 5)} \Rightarrow \frac{100}{\frac{2}{5}} = \frac{100}{2 \cdot 5} = 10\] |
|
|
|
- =**= :: (=regular function [C++]=) Takes 2 number arguments and returns the the first argument |
|
|
|
taken to the power of the second argument. |
|
|
|
- =%= :: (=regular function [C++]=) Takes 2 number arguments and rounds them down to integer values |
|
|
|
and then returns the remainder of the division of the first argument by the second. |
|
|
|
- =not= :: (=regular function [C++]=) |
|
|
|
- =and= :: (=regular function [C++]=) |
|
|
|
- =or= :: (=regular function [C++]=) |
|
|
|
- =increment= :: (=regular function [Slime]=) |
|
|
|
- =decrement= :: (=regular function [Slime]=) |
|
|
|
|
|
|
|
** Comparison functions |
|
|
|
- === :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff |
|
|
|
\[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i = \text{arg}_{i+1}\] |
|
|
|
\indent and =()= otherwise. |
|
|
|
|
|
|
|
{{{slime_header}}} |
|
|
|
#+begin_src slime |
|
|
|
;; numbers |
|
|
|
(pe (= 1 (+ -1 2))) |
|
|
|
(pe (= 0 (** 3 0))) |
|
|
|
;; strings |
|
|
|
(pe (= "abc" "abc")) |
|
|
|
(pe (= "abc" "abs")) |
|
|
|
;; symbols & keywords |
|
|
|
(pe (= 'sym1 'sym2)) |
|
|
|
(pe (= :key1 :key1)) |
|
|
|
#+end_src |
|
|
|
|
|
|
|
#+RESULTS: |
|
|
|
: evaluates to => |
|
|
|
: (= 1 (+ -1 2)) evaluates to t |
|
|
|
: (= 0 (** 3 0)) evaluates to () |
|
|
|
: (= abc abc) evaluates to t |
|
|
|
: (= abc abs) evaluates to () |
|
|
|
: (= 'sym1 'sym2) evaluates to () |
|
|
|
: (= :key1 :key1) evaluates to t |
|
|
|
|
|
|
|
|
|
|
|
- =>= :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff |
|
|
|
\[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i > \text{arg}_{i+1}\] |
|
|
|
\indent and =()= otherwise. |
|
|
|
- =>== :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff |
|
|
|
\[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i \ge \text{arg}_{i+1}\] |
|
|
|
\indent and =()= otherwise. |
|
|
|
- =<= :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff |
|
|
|
\[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i < \text{arg}_{i+1}\] |
|
|
|
\indent and =()= otherwise. |
|
|
|
- =<== :: (=regular function [C++]=) Takes 0 or more arguments and returns =t= iff |
|
|
|
\[\forall\ \text{arg}_i \in \text{arguments}: \text{arg}_i \le \text{arg}_{i+1}\] |
|
|
|
\indent and =()= otherwise. |
|
|
|
|
|
|
|
** Controlflow |
|
|
|
+ =if= :: (=special form [C++]=) |
|
|
|
+ =cond= :: (=special form [Slime]=) |
|
|
|
+ =while= :: (=special form [C++]=) |
|
|
|
+ =n-times= :: (=special form [Slime]=) |
|
|
|
|
|
|
|
+ =when= :: (=special form [Slime]=) |
|
|
|
+ =unless= :: (=special form [Slime]=) |
|
|
|
|
|
|
|
** Functions for lists |
|
|
|
- =pair= :: (=regular function [C++]=) |
|
|
|
- =first= :: (=regular function [C++]=) |
|
|
|
- =rest= :: (=regular function [C++]=) |
|
|
|
- =list= :: (=regular function [C++]=) |
|
|
|
|
|
|
|
- =end= :: (=regular function [Slime]=) |
|
|
|
- =last= :: (=regular function [Slime]=) |
|
|
|
- =extend= :: (=regular function [Slime]=) |
|
|
|
- =append= :: (=regular function [Slime]=) |
|
|
|
- =length= :: (=regular function [Slime]=) |
|
|
|
|
|
|
|
- =range= :: (=regular function [Slime]=) |
|
|
|
- =range-while= :: (=regular function [Slime]=) |
|
|
|
- =zip= :: (=regular function [Slime]=) |
|
|
|
- =enumerate= :: (=regular function [Slime]=) |
|
|
|
|
|
|
|
|
|
|
|
- =map= :: (=regular function [Slime]=) |
|
|
|
- =filter= :: (=regular function [Slime]=) |
|
|
|
- =reduce= :: (=regular function [Slime]=) |
|
|
|
- =reduce-binary= :: (=regular function [Slime]=) |
|
|
|
|
|
|
|
** Functions on types |
|
|
|
- =type= :: (=regular function [C++]=) |
|
|
|
- =set-type= :: (=regular function [C++]=) |
|
|
|
- =delete-type= :: (=regular function [C++]=) |
|
|
|
- =symbol->keyword= :: (=regular function [C++]=) |
|
|
|
- =string->symbol= :: (=regular function [C++]=) |
|
|
|
- =symbol->string= :: (=regular function [C++]=) |
|
|
|
|
|
|
|
** Help and debugging |
|
|
|
- =break= :: (=regular function [C++]=) |
|
|
|
- =memstat= :: (=regular function [C++]=) |
|
|
|
- =info= :: (=regular function [C++]=) |
|
|
|
- =show= :: (=regular function [C++]=) |
|
|
|
- =pe= :: (=special form [Slime]=) |
|
|
|
|
|
|
|
** I/O |
|
|
|
- =print= :: (=regular function [C++]=) |
|
|
|
- =read= :: (=regular function [C++]=) |
|
|
|
- =printf= :: (=regular function [Slime]=) |
|
|
|
|
|
|
|
** Errors |
|
|
|
- =try= :: (=regular function [C++]=) |
|
|
|
- =error= :: (=regular function [C++]=) |
|
|
|
|
|
|
|
** no category |
|
|
|
- =eval= :: (=regular function [C++]=) |
|
|
|
- =apply= :: (=regular function [C++]=) |
|
|
|
- =lambda= :: (=regular function [C++]=) |
|
|
|
- =special-lambda= :: (=regular function [C++]=) |
|
|
|
|
|
|
|
- =copy= :: (=regular function [C++]=) |
|
|
|
- =import= :: (=regular function [C++]=) |
|
|
|
- =load= :: (=regular function [C++]=) |
|
|
|
- =exit= :: (=regular function [C++]=) |
|
|
|
- =let= :: (=regular function [C++]=) |
|
|
|
- =quote= :: (=regular function [C++]=) |
|
|
|
- =quasiquote= :: (=regular function [C++]=) |
|
|
|
- =unquote= :: (=regular function [C++]=) |
|
|
|
- =mutate= :: (=regular function [C++]=) |
|
|
|
- =define= :: (=regular function [C++]=) |
|
|
|
- =assert= :: (=regular function [C++]=) |
|
|
|
* testbox :noexport: |
|
|
|
#+BEGIN_SRC ditaa :file diagrams/test.eps :cmdline --no-separation --no-shadows |
|
|
|
+-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+ |
|
|
|
@@ -67,25 +572,31 @@ sad |
|
|
|
#+options: H:2 toc:nil |
|
|
|
|
|
|
|
#+macro: slime_header (eval (concat "#+header: :exports both" "\n" "#+attr_latex: :options keywordstyle=\\color{slimeKeyword}, commentstyle=\\color{slimeComment}, stringstyle=\\color{slimeString}")) |
|
|
|
#+macro: ditaa_header (eval (concat "#+header: :exports results :cmdline --no-separation --no-shadows")) |
|
|
|
|
|
|
|
#+latex_class:article |
|
|
|
|
|
|
|
#+latex_header: \usepackage[german]{babel} |
|
|
|
#+latex_header: \usepackage{xcolor} |
|
|
|
#+latex_header: \usepackage{listings} |
|
|
|
#+latex_header: \usepackage[pageanchor=false]{hyperref} |
|
|
|
|
|
|
|
#+latex_header: \definecolor{slimeKeyword}{HTML}{B58900} |
|
|
|
#+latex_header: \definecolor{slimeString}{HTML}{2AA198} |
|
|
|
#+latex_header: \definecolor{slimeComment}{HTML}{839496} |
|
|
|
|
|
|
|
|
|
|
|
#+latex_header: \lstdefinelanguage{slime} |
|
|
|
#+latex_header: { |
|
|
|
#+latex_header: % list of keywords |
|
|
|
#+latex_header: morekeywords={ |
|
|
|
#+latex_header: =, >, >=, <, <=, +, -, *, /, **, assert, define, define-syntax, mutate, if, quote, quasiquote, and, or, not, while, let, lambda, special-lambda, eval, begin, list, pair, first, rest, set-type, delete-type, type, info, show, print, read, exit, break, memstat, try, load, copy, error, symbol->keyword, string->symbol, symbol->string, concat-strings |
|
|
|
#+latex_header: }, |
|
|
|
#+latex_header: otherkeywords = {+,=,>,>=,<,<=,-,*,/,**}, |
|
|
|
#+latex_header: morekeywords={+,=,>,>=,<,<=,-,*,/,**,assert,define,define-syntax,mutate,if,quote,quasiquote,and,or,not,while,let,lambda,special,eval,begin,list,pair,first,rest,set-type,delete-type,type,info,show,print,read,exit,break,memstat,try,load,copy,error,symbol->keyword,string->symbol,symbol->string,concat-strings}, |
|
|
|
#+latex_header: basicstyle=\ttfamily\small, |
|
|
|
#+latex_header: showstringspaces=false, |
|
|
|
#+latex_header: sensitive=true, % keywords are not case-sensitive |
|
|
|
#+latex_header: morecomment=[l]{;}, % l is for line comment |
|
|
|
#+latex_header: morestring=[b]" % defines that strings are enclosed in double quotes |
|
|
|
#+latex_header: } |
|
|
|
|
|
|
|
#+latex_header:\AtBeginDocument{\renewcommand{\lstlistingname}{Code}} |
|
|
|
#+latex_header:\AtBeginDocument{\renewcommand{\ref}[1]{\autoref{#1}}} |