Language
========

Picrin's core language is the R7RS scheme with some powerful extensions. Please visit http://r7rs.org/ for the information of R7RS's design and underlying thoughts.

The REPL
--------

At the REPL start-up time, some usuful built-in libraries listed below will be automatically imported.

- ``(scheme base)``
- ``(scheme load)``
- ``(scheme process-context)``
- ``(scheme write)``
- ``(scheme file)``
- ``(scheme inexact)``
- ``(scheme cxr)``
- ``(scheme lazy)``
- ``(scheme time)``

Compliance with R7RS
---------------------

================================================ ========== ==========================================================================================================================
section                                          status     comments
================================================ ========== ==========================================================================================================================
2.2 Whitespace and comments                      yes
2.3 Other notations                              incomplete #e #i #b #o #d #x
2.4 Datum labels                                 yes
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                        yes        As the report specifies, ``apply``, ``call/cc``, and ``call-with-values`` perform tail calls
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                                  incomplete ``include-ci``. TODO: Once ``read`` is implemented rewrite ``include`` macro with it.
4.2.1 Conditionals                               incomplete TODO: ``cond-expand``
4.2.2 Binding constructs                         yes
4.2.3 Sequencing                                 yes
4.2.4 Iteration                                  yes
4.2.5 Delayed evaluation                         N/A
4.2.6 Dynamic bindings                           yes
4.2.7 Exception handling                         no         ``guard`` syntax.
4.2.8 Quasiquotation                             yes        can be safely nested. TODO: multiple argument for unquote
4.2.9 Case-lambda                                N/A
4.3.1 Bindings constructs for syntactic keywords incomplete [#]_
4.3.2 Pattern language                           yes        ``syntax-rules``
4.3.3 Signaling errors in macro transformers     yes
5.1 Programs                                     yes
5.2 Import declarations                          incomplete only simple import declarations, no support for import with renaming.
5.3.1 Top level definitions                      yes
5.3.2 Internal definitions                       yes        TODO: interreferential definitions
5.3.3 Multiple-value definitions                 yes
5.4 Syntax definitions                           yes        TODO: internal macro definition is not supported.
5.5 Recored-type definitions                     yes
5.6.1 Library Syntax                             incomplete In picrin, libraries can be reopend and can be nested.
5.6.2 Library example                            N/A
5.7 The REPL                                     yes
6.1 Equivalence predicates                       yes        TODO: equal? must terminate if circular structure is given
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                 incomplete only partial support supplied.
6.3 Booleans                                     yes
6.4 Pairs and lists                              yes        ``list?`` is safe for using against circular list.
6.5 Symbols                                      yes
6.6 Characters                                   yes
6.7 Strings                                      yes
6.8 Vectors                                      yes
6.9 Bytevectors                                  yes
6.10  Control features                           yes
6.11 Exceptions                                  yes        ``raise-continuable`` is not supported
6.12 Environments and evaluation                 N/A
6.13.1 Ports                                     yes
6.13.2 Input                                     yes
6.13.3 Output                                    yes
6.14 System interface                            yes
================================================ ========== ==========================================================================================================================

.. [#] Picrin provides hygienic macros in addition to so-called legacy macro (``define-macro``), such as syntactic closure, explicit renaming macro, and implicit renaming macro. As of now let-syntax and letrec-syntax are not provided.