Go to file
Yuichi Nishiwaki a68b470e06 pic_get_args can parse '*' 2013-11-15 22:53:41 +09:00
bin add make stuff 2013-10-09 17:10:58 +09:00
etc add benchmark log notes to tak.scm 2013-11-04 20:37:51 -05:00
extlib/xhash fix a memory bug in xhash 2013-10-23 20:09:06 +09:00
include shrink default arena size! 2013-11-15 19:54:47 +09:00
lib git file management 2013-10-20 18:47:05 +09:00
piclib define math comp predicates as C functions 2013-11-15 22:51:51 +09:00
src pic_get_args can parse '*' 2013-11-15 22:53:41 +09:00
t add let* and letrec* 2013-11-14 13:17:54 +09:00
tools accept empty lines in repl 2013-11-13 17:37:05 +09:00
.gitignore ignore debug info files 2013-11-05 20:36:16 +09:00
Makefile s/build-debug/debug-build/g 2013-11-15 17:07:57 +09:00
README.md rename picconf.h to config.h 2013-11-15 16:52:08 +09:00

README.md

This product is developed at the second-grade course, Informatic Science
Basic Experiment class at the University of Tokyo.

Picrin - a lightweight scheme interpreter

Features

  • R7RS compatibility (but partial support)
  • reentrant design (all VM states are stored in single global state object)
  • bytecode interpreter (based on Stack VM)
  • direct threaded VM
  • Internal representation by Nan-Boxing
  • conservative call/cc implementation (users can freely interleave native stack with VM stack)
  • exact GC (simple mark and sweep, partially reference count is used as well)
  • advanced REPL support (multi-line input, etc)
  • tiny & portable library (all functions will be in libpicrin.so)

Compliance with R7RS

section status comments
2.2 Whitespace and comments incomplete block comments are not implemented
2.3 Other notations incomplete #e #i #b #o #d #x
2.4 Datum labels no unsupported
3.1 Variables, syntactic keywords, and regions
3.2 Disjointness of types yes
3.3 External representations
3.4 Storage model yes
3.5 Proper tail recursion incomplete apply, call/cc, call/values, eval are not yet
4.1.1 Variable references yes
4.1.2 Literal expressions yes
4.1.3 Procedure calls yes In picrin () is self-evaluating
4.1.4 Procedures yes
4.1.5 Conditionals yes In picrin (if #f #f) returns #f
4.1.6 Assignments yes
4.1.7 Inclusion no include and include-ci
4.2.1 Conditionals incomplete TODO: cond-expand
4.2.2 Binding constructs incomplete TODO: let-values, let*-values
4.2.3 Sequencing yes
4.2.4 Iteration yes TODO: do is unsafe when nested
4.2.5 Delayed evaluation N/A
4.2.6 Dynamic bindings no TODO: make-parameter, parameterize in C level
4.2.7 Exception handling no guard syntax.
4.2.8 Quasiquotation incomplete nested is unsupported
4.2.9 Case-lambda N/A
4.3.1 Bindings constructs for syntactic keywords no Instead, picrin provides so-called legacy macro (define-macro).
4.3.2 Pattern language -- see above.
4.3.3 Signaling errors in macro transformers -- see above.
5.1 Programs yes
5.2 Import declarations no
5.3.1 Top level definitions yes
5.3.2 Internal definitions yes TODO: interreferential definitions
5.3.3 Multiple-value definitions no
5.4 Syntax definitions -- see notes on section 4.3.1.
5.5 Recored-type definitions no
5.6.1 Library Syntax no
5.6.2 Library example N/A
5.7 The REPL yes
6.1 Equivalence predicates yes
6.2.1 Numerical types yes picrin has only two types of internal representation of numbers: fixnum and double float. It still comforms the R7RS spec.
6.2.2 Exactness yes
6.2.3 Implementation restrictions yes
6.2.4 Implementation extensions yes
6.2.5 Syntax of numerical constants yes
6.2.6 Numerical operations yes denominator, numerator, and rationalize are not supported for now. Also, picrin does not provide complex library procedures.
6.2.7 Numerical input and output no
6.3 Booleans yes
6.4 Pairs and lists yes
6.5 Symbols yes
6.6 Characters yes
6.7 Strings incomplete TODO: almost all functions in the section :-(
6.8 Vectors incomplete TODO: vector-copy, ...etc
6.9 Bytevectors incomplete TODO: string<->utf8 conversion, etc
6.10 Control features incomplete TODO: string-map, vector-map, ...etc
6.11 Exceptions no
6.12 Environments and evaluation no
6.13 Ports incomplete
6.14 System interface incomplete exit is unsafe when used with dynamic-wind

Homepage

Currently picrin is hosted on Github. You can freely send a bug report or pull-request, and fork the repository.

https://github.com/wasabiz/picrin

How to use it

  • debug-run

    By default make command runs REPL with all debug flags enabled (PIC_GC_STRESS, VM_DEBUG, DEBUG).

      $ make
    
  • build

      $ make build
    

    built executable binary will be under bin/ directory and shared library libpicrin.so under lib/.

    If you want to build picrin on other systems than x86_64, make sure PIC_NAN_BOXING flag is turned off (see include/config.h for detail).

  • run

    Simply directly run the binary bin/picrin from terminal, or you can use make to execute it like this.

      $ make run
    

In the default option, when make command is called without arguments, it builds the binary and right after that dropped into the picrin interactive shell (REPL).

  • install

    As of now picrin does not provide a command automatically installs the binary. If you want to place picrin library and binary in a parmanent directory, please do it by hand.

Requirement

picrin scheme depends on some external libraries to build the binary:

  • bison
  • yacc
  • make
  • gcc
  • readline

The compilation is tested only on Mac OSX. I think (or hope) it'll be ok to compile and run on other operating systems such as Linux or Windows, but there's no guarantee :(

Authors

Yuichi Nishiwaki (yuichi.nishiwaki at gmail.com)