-
Notifications
You must be signed in to change notification settings - Fork 0
aoh/mindo
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Mindo -- Use and abuse of lambda calculus. Written by Aki Helin in 2003, revised later. No rights reserved. OVERVIEW This directory contains an interpreter, a sort of bytecode compiler and some example applications for a toy programming language called Mindo. It is a lazy typeless purely functional language. More precisely it is an implementation of lambda calculus. Lambda calculus (LC) is a simple formal system that can be used to reason about computation. LC contains only variables, applications and abstraction, which is used to create an anonymous function of one variable. Data structures, recursion and other things one needs to perform some computation must to be built from these primitive building blocks. Mindo programs are lambda expressions, modulo some syntactic sugar. Each program is first translated to a lambda expression, which is then compiled to a combinator expression. Mindo consists of a combinator graph reducer (sen) which is written in C, and a bytecode compiler written in Mindo itself. A Mindo program is a map from one input bit stream to an output bit stream. Bit order is such that the identity function works as the UNIX 'cat' utility. Sen works by first reading a combinator expression from standard input. It then begins evaluating the expression and applies it to a node representing input to the program. If the value (output) of the program depends on the input, more standard input is read and is encoded as the input lambda expression. As the program is evaluated, the weak head normal form is used to take output bits from the program. Evaluation terminates when an EOF is read, or an error occurs. More or less information may be available at: http://213.139.166.37/home/aki/mindo FILES sen.c -- source code for sen swim.ce -- bytecode compiler (in bytecode) swim.s -- bytecode compiler (mindo source) app/ -- some example applications in usual and compiled form INSTALLATION The language can be used for example as follows: 1. Extract the package. shell$ tar -zxvf Mindo.tar.gz 2. Go to the directory. shell$ cd mindo 3. Compile sen. shell$ cc -O3 -o sen src/sen.c 4. Try it out. shell$ cat app/primes.ce | ./sen Control-c stops. Programs can be compiled to combinator expressions with swim. It is in swim.ce file, and sources are in app/swim.s It can be used by giving it and the program to compile to sen. For example to compile the cellular automata example program, issue shell$ cat swim.ce app/cell.s | ./sen > app/cell.ce to save the compiled form, or just interpret it directly with shell$ cat swim.ce app/cell.s | ./sen | ./sen Compiling larger programs takes a while. Swim can be recompiled with shell$ cat swim.ce app/swim.s | ./sen -H 32 > new-swim.ce and the regular expression example by including the library shell$ cat swim.ce app/stdlib.s app/reg.s | ./sen -H 32 > app/reg.ce The -H switch can be used to set the amount of memory sen can use. Giving more memory generally results in faster operation. Compiling reg.ce takes a few minutes. It can be run with: shell$ cat app/reg.ce - | ./sen Give regular expression: c(a+d)*r read: c(a+d)*r Compiles to DFA: Finite Automata { States: ( 0 1 2 3 ) Alphabet: ( c a d r ) Transitions: (3 r 0) (3 d 3) (3 a 3) (3 c 1) (2 r 1) (2 d 1) (2 a 1) (2 c 3) (1 r 1) (1 d 1) (1 a 1) (1 c 1) (0 r 1) (0 d 1) (0 a 1) (0 c 1) Start state: 2 End state(s): ( 0 ) } Type in text to match against the automata. > caddar Read: caddar Verdict: Match > car Read: car Verdict: Match > cheddar Read: cheddar Verdict: No match >^D shell$ The -V switch gives some garbage collection statistics. SYNTAX Swim accepts a fairly standard representation of lambda expressions and also some extended syntax. Lambda is represented as \, and application is written by placing the operator and one or more arguments in parenthesis. The dot and implicit parenthesis are not used. Below is a chart of the syntax allowed by swim. +-----------------------------+------------------------------+ | Mindo | Lambda calculus | +-----------------------------+------------------------------+ | def name as | (\name <rest> | | <definition> | <definition>) | | <rest> | | +-----------------------------+------------------------------+ | def fname var* as | (\fname \var* <rest> | | <definition> | <definition>) | | <rest> | | +-----------------------------+------------------------------+ | fn var* in | \var* <definition> | | <definition> | | +-----------------------------+------------------------------+ | def rec fname var* as | (\fname <rest> | | <definition> | (Y \fname \var* | | <rest> | <definition)) | +-----------------------------+------------------------------+ | def var* from | (\var* <rest> <producer>) | | <producer> | | | <rest> | | +-----------------------------+------------------------------+ | <expression> | (\name1 | | where name1 is <def1> | (\name2 | | and name2 is <def2> | <expression> | | | <def2>) | | | <def1>) | +-----------------------------+------------------------------+ SEN Sen uses a fairly standard set of combinators. The letter 'a' is used to mark an application. It is left as a exercise to figure out how. Let 1, 2, 3 and 4 and a be arbitrary expressions. (i 1) = 1 (y 1) = (1 (y 1)) (k 1 2) = 1 (w 1 2) = (1 2 2) (t 1 2) = (1 (1 2)) (c 1 2 3) = (1 3 2) (b 1 2 3) = (1 (2 3)) (s 1 2 3) = (1 3 (2 3)) (n 1 2 3 4) = (1 (2 4) 3) (l 1 2 3 4) = (1 (2 (3 4))) (m 1 2 3 4) = (1 (2 4) (3 4))
About
executable λ-calclulus
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published