Features
LispPad's Scheme language provides support for the following core language features, many of which are derived from the R7RS (small) Scheme standard:
- Modules via R7RS libraries
- Hygienic macros based on the syntax-rules standard
- First-class environments
call/cc
,dynamic-wind
and exceptions- Dynamically-scoped paramaters
- Multiple return values
- Delayed execution via promises and streams
- Support for the full numerical tower consisting of arbitrary size integers, rationals, real numbers, and inexact complex numbers.
- Unicode strings and characters
- Vectors and bytevectors
- Text and binary ports
- R7RS-compliant records
- R6RS-compliant hashtables
- R6RS-compliant enumerations
- SRFI 18-compliant multi-threading
Included Libraries
LispPad supports all standard R7RS (small) libraries:
(scheme base)
(scheme case-lambda)
(scheme char)
(scheme complex)
(scheme cxr)
,(scheme eval)
(scheme file)
(scheme inexact)
(scheme lazy)
(scheme load)
(scheme process-context)
(scheme read)
(scheme repl)
(scheme time)
(scheme write)
(scheme r5rs)
Most of the R7RS (large) libraries from the "Red" and "Tangerine" edition are supported as well:
(scheme bitwise)
(scheme box)
(scheme charset)
(scheme comparator)
(scheme division)
(scheme fixnum)
(scheme flonum)
(scheme generator)
(scheme hash-table)
(scheme ideque)
(scheme list)
(scheme mapping)
(scheme rlist)
(scheme set)
(scheme sort)
(scheme stream)
(scheme text)
(scheme vector)
LispPad also includes all the LispKit libraries:
(lispkit base)
(lispkit box)
(lispkit bytevector)
(lispkit char)
(lispkit char-set)
(lispkit clos)
(lispkit combinator)
(lispkit comparator)
(lispkit control)
(lispkit core)
(lispkit csv)
(lispkit datatype)
(lispkit date-time)
(lispkit debug)
(lispkit disjoint-set)
(lispkit draw)
(lispkit draw turtle)
(lispkit dynamic)
(lispkit enum)
(lispkit gvector)
(lispkit hashtable)
(lispkit heap)
(lispkit iterate)
(lispkit json)
(lispkit list)
(lispkit log)
(lispkit logic)
(lispkit markdown)
(lispkit match)
(lispkit math)
(lispkit object)
(lispkit pdf)
(lispkit port)
(lispkit prettify)
(lispkit queue)
(lispkit record)
(lispkit regexp)
(lispkit set)
(lispkit sqlite)
(lispkit stack)
(lispkit stream)
(lispkit string)
(lispkit system)
(lispkit system os)
(lispkit test)
(lispkit type)
(lispkit vector)
(lispkit wt-tree)
LispPad currently comes with two LispPad-specific libraries providing a native integration of drawings defined via (lispkit draw)
and (lispkit draw turtle)
and a means to script the application. There is also a LispPad-specific logging library which extends the LispKit logging library.
The following SRFI (Scheme Request for Implementation) libraries have been ported to LispPad and are included in the latest LispPad distribution:
- SRFI 1: List Library
- SRFI 2: AND-LET* - an AND with local bindings, a guarded LET* special form
- SRFI 6: Basic String Ports
- SRFI 8: receive - Binding to multiple values
- SRFI 9: Defining Record Types
- SRFI 11: Syntax for receiving multiple values
- SRFI 14: Character-set library
- SRFI 16: Syntax for procedures of variable arity
- SRFI 17: Generalized set!
- SRFI 18: Multithreading support
- SRFI 19: Time Data Types and Procedures
- SRFI 23: Error reporting mechanism
- SRFI 26: Notation for Specializing Parameters without Currying
- SRFI 27: Sources of Random Bits
- SRFI 28: Basic Format Strings
- SRFI 31: A special form rec for recursive evaluation
- SRFI 33: Integer Bitwise-operation Library
- SRFI 34: Exception Handling for Programs
- SRFI 35: Conditions
- SRFI 39: Parameter objects
- SRFI 41: Streams
- SRFI 46: Basic Syntax-rules Extensions
- SRFI 48: Intermediate Format Strings
- SRFI 51: Handling rest list
- SRFI 54: Formatting
- SRFI 55: require-extension
- SRFI 63: Homogeneous and Heterogeneous Arrays
- SRFI 64: A Scheme API for test suites
- SRFI 69: Basic hash tables
- SRFI 87:
=>
in case clauses - SRFI 95: Sorting and Merging
- SRFI 98: An interface to access environment variables
- SRFI 101: Purely Functional Random-Access Pairs and Lists
- SRFI 102: Procedure Arity Inspection
- SRFI 111: Boxes
- SRFI 112: Environment inquiry
- SRFI 113: Sets and bags
- SRFI 121: Generators
- SRFI 125: Intermediate hash tables
- SRFI 128: Comparators
- SRFI 129: Titlecase procedures
- SRFI 132: Sort Libraries
- SRFI 133: Vector Library
- SRFI 134: Immutable Deques
- SRFI 135: Immutable Texts
- SRFI 137: Minimal Unique Types
- SRFI 142: Bitwise Operations
- SRFI 143: Fixnums
- SRFI 144: Flonums
- SRFI 145: Assumptions
- SRFI 146: Mappings
- SRFI 151: Bitwise Operations
- SRFI 152: String Library
- SRFI 154: First-class dynamic extents
- SRFI 155: Promises
- SRFI 158: Generators and Accumulators
- SRFI 161: Unifiable Boxes
- SRFI 162: Comparators sublibrary
- SRFI 165: The Environment Monad
- SRFI 166: Monadic Formatting
- SRFI 167: Ordered Key Value Store
- SRFI 173: Hooks
- SRFI 174: POSIX Timespecs
- SRFI 175: ASCII Character Library
- SRFI 177: Portable keyword arguments
- SRFI 180: JSON
- SRFI 189: Maybe and Either: optional container types
- SRFI 194: Random data generators
- SRFI 195: Multiple-value boxes
- SRFI 196: Range Objects
- SRFI 204: Wright-Cartwright-Shinn pattern matcher
- SRFI 208: NaN procedures
- SRFI 209: Enums and Enum Sets
- SRFI 210: Procedures and Syntax for Multiple Values
- SRFI 214: Flexvectors
- SRFI 215: Central log exchange
- SRFI 216: SICP Prerequisites
- SRFI 217: Integer sets
- SRFI 219: Define higher-order lambda
- SRFI 221: Generator/accumulator sub-library
- SRFI 222: Compound objects
- SRFI 223: Generalized binary search procedures
- SRFI 224: Integer mappings
- SRFI 227: Optional Arguments
- SRFI 229: Tagged procedures
- SRFI 230: Atomic Operations
The source code of the Scheme interpreter and the included libraries has been open-sourced and published at GitHub. Example code and the Scheme sources of the included libraries can be found here.
It is also possible to access the source code from within LispPad. Pressing option while opening the File menu will reveal a menu item "Open LispKit…" which provides access to the LispKit source code bundled with LispPad. Similarly, pressing control while opening the File menu will reveal a menu item "Open LispPad..." for accessing the LispPad-specific code, e.g like the LispPad prelude.