Carbone Ruby VM
README
COPYING
THANKS
FEATURES
TODO
ChangeLog
doc/guide.txt
doc/generator.txt
doc/input_language.txt
doc/gc.txt
doc/proposals.txt
20020416_1129

Input Language
------------------

The input language  - Carbone's first native language  - is Lisp-like,
corresponding to a subset of LGram level 1.

It is parsed and precompiled Ruby code.

Sooner or  later - when  the Ruby parser  will work and a  compiler is
written (in Ruby) - the Carbone input language will become an internal
data format.  It's definition  is: "The input  for the  generator, the
last  step in compilation."   (This is  also the  reason, why  you can
build Carbone with `make gen'; it's derived from a generator test)

Look at the tests to get an impression.

   tests/t0_base.lg

for the language basics; use `./gen -Stc tests/t0_base.lg | less' to
see whats happening) 

sequence:
	(body list_of(statements))

literals:
	(lit number)   e.g. (lit 1) (lit 2)
	(lit symbol)   e.g. (lit a) (lit *a--<->--b*)
	(lit list)     e.g. (lit (+ (* 1 2) (* 3 4)))
	synonym:
	(quote ...)

constants:
	(const nil const-name)  e.g. (const nil Object)
	                             (const nilFixnum)
	Currently only outer constants are supported.
	

reference comparison:
	(eql a b)   compare the references a and b

simple conditions:
	(scond (true) a b)    means 'a && b'
	(scond (false) a b)   means 'a || b'

while loop:
	(while condition instruction)

calling C functions generically:
	(cfunc c-function-name param1 param2 ...)

	will call a C function that has to be compiled into the VM and
	declared with something like: 
	    `cfunc_declare("meth_generate", meth_generate, 1, 2);'
	parameters to cfunc_declare():
	     * method name as string 
	     * the C function itself
	     * 0 for returns-void; 1 for returns-something(e.g. some-VALUE) 
	     * number of parameters

send:
	(send receiver selector (list of arguments) rest-array proc)

	for example, the Ruby code `1+2' would translate to:
	  (send
	   (lit 1)        ;; rcv
	   +              ;; sel
	   ((lit 2)))     ;; args

	rest_args and proc are prevu, but not yet fully implemented.


invoke:
	(invoke rcv callable)
	evaluates `rcv' and `callable';
	calls callable with `rcv' as self;
	callable must be a method of rcv's class or a block which was
        compiled for it;


and inside the context of a method or a block:

self:
	(self)

local variables:
	(lv  lvar-name)  get a local-variable
	(lv= lvar-name)  set a local-variable

parameters:
	(par  parameter-name)

instance variables:
	(iv ivar-name)
	(iv= ivar-name new-value)

method existance:
	(boundp class selector)

block/proc creation:
	(block (compilation-hints) code)

At the end, the code is the documentation: see comp/generator.c

Currently everything has to be packaged inside
`(snippets list_of(code expected-result))'
(Excluded the code given at the commandline with the -e option.)



Available Methods
-----------------

define_class
------------


define_method
-------------

(send                      ; see main.c#load_builtins()
  target-class
  define_method
  ((lit
    (method-name
     (parameter-list rest-parameter)
     (stack-variables)    ; svars
     (local-variables)    ; lvars
     (proc)
     (method-code)))))


In the directory carbone/builtins/ you can see that I'm trying to
_declare_ builtin methods and not to hardcode them in C.
builtins/trans.rb is doing the translation to C code and they get
appended to the set of VM primitives in carbone/vm/Makefile.

See the README in this directory.

explain compilation-flags