Code Monkey home page Code Monkey logo

swift-lispkit's Introduction

LispKit Swift LispKit

Platform: macOS Language: Swift 4.2 IDE: Xcode 10.1 Carthage: compatible License: Apache

Overview

LispKit is a framework for building Lisp-based extension and scripting languages for macOS applications. LispKit is fully written in the programming language Swift. LispKit implements a core language based on the R7RS (small) Scheme standard. It is extensible, allowing the inclusion of new native libraries written in Swift, of new libraries written in Scheme, as well as custom modifications of the core environment consisting of a compiler, a virtual machine as well as the core libraries.

So far, performance was not a priority in the development of LispKit. The LispKit compiler does not perform many code optimizations and the performance of the system is below state of the art Lisp and Scheme implementations.

LispPad implements a simple, lightweight, integrated development environment for LispKit on macOS with a Cocoa-based UI. A simpler command-line tool with similar functionality is provided by the LispKit framework itself (see below).

Features

LispKit provides support for the following core features, many of which are based on R7RS:

  • Modules based on R7RS libraries
  • Hygienic macros based on syntax-rules
  • First-class environments
  • call/cc, dynamic-wind and exceptions
  • Dynamically-scoped parameters
  • 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
  • All 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)
  • Some R7RS (large) libraries from Scheme Red edition: (scheme box), (scheme charset), (scheme comparator), (scheme generator), (scheme hash-table), (scheme ideque), (scheme list), (scheme rlist), (scheme set), (scheme sort), (scheme stream), (scheme text), (scheme vector)
  • LispKit-specific libraries: (lispkit box), (lispkit type), (lispkit hashtable), (lispkit log), (lispkit test), (lispkit match), (lispkit datatype), (lispkit object), (lispkit clos), (lispkit enum), (lispkit logic), (lispkit iteration), (lispkit gvector), (lispkit set), (lispkit stack), (lispkit queue), (lispkit heap), (lispkit graph), (lispkit wt-tree), (lispkit prettify), (lispkit json), (lispkit csv), (lispkit char-set), (lispkit date-time), (lispkit regexp), (lispkit draw), (lispkit draw turtle), and (lispkit pdf)

LispKit is incompatible or incomplete with respect to the following R7RS features:

  • Lists are immutable. Mutable cons-cells are supported in a way similar to Racket
  • Datum comments introduced via #; do not always work as in other Scheme dialects.

The following SRFI libraries have been ported to LispKit and are included in the framework:

Architecture

From an architectural perspective, LispKit consists of:

  1. a compiler translating LispKit expressions into bytecode,
  2. a virtual machine for interpreting the generated bytecode. The virtual machine is stack-based, handles tail calls and continuations, and provides a garbage collector.
  3. a large range of libraries, all packaged together with the framework.

Details can be found in the LispKit Wiki.

Command-line tool

Overview

This project also includes a command-line tool, called the LispKit Shell, for executing LispKit applications in the terminal. It can be used to try out and experiment with the LispKit framework. The command-line tool can also be used interactively as a read-eval-print loop. The read-eval-print loop parses the entered LispKit expression, compiles it to bytecode, executes it, and displays the result.

Downloading the source code

First, clone the LispKit repository via git. The following command will create a directory swift-lispkit.

> git clone https://github.com/objecthub/swift-lispkit.git
Cloning into 'swift-lispkit'...
remote: Counting objects: 1849, done.
remote: Compressing objects: 100% (39/39), done.
remote: Total 1849 (delta 9), reused 0 (delta 0), pack-reused 1806
Receiving objects: 100% (1849/1849), 689.43 KiB | 666.00 KiB/s, done.
Resolving deltas: 100% (1430/1430), done.

Running the command-line tool in Xcode

Fetch dependencies and build them from scratch via carthage:

> cd swift-lispkit
> carthage bootstrap
*** Checking out swift-numberkit at "1.6.0"
*** xcodebuild output can be found in /var/folders/c_/h31lvvtx72s3zhc9bvxd0p480000gn/T/carthage-xcodebuild.46W8Z7.log
*** Building scheme "NumberKit (shared)" in NumberKit.xcodeproj

Now, it's possible to switch to Xcode and build the command-line tool via scheme LispKitRepl:

> open LispKit.xcodeproj

Compiling the command-line tool with the Swift Package Manager

A debug binary can be built in the following way:

> cd swift-lispkit
> swift build -Xswiftc "-target" -Xswiftc "x86_64-apple-macosx10.12" \
  -Xswiftc "-D" -Xswiftc "SPM"
Compile Swift Module 'NumberKit' (6 sources)
Compile Swift Module 'CommandLineKit' (15 sources)
Compile Swift Module 'LispKit' (83 sources)
Compile Swift Module 'LispKitRepl' (2 sources)
Linking ./.build/x86_64-apple-macosx10.10/debug/LispKitRepl

A release binary can be built like this:

> cd swift-lispkit
> swift build -c release -Xswiftc -static-stdlib -Xswiftc "-target" \
  -Xswiftc "x86_64-apple-macosx10.12" -Xswiftc "-D" -Xswiftc "SPM"
Compile Swift Module 'NumberKit' (6 sources)
Compile Swift Module 'CommandLineKit' (15 sources)
Compile Swift Module 'LispKit' (83 sources)
Compile Swift Module 'LispKitRepl' (2 sources)
Linking ./.build/x86_64-apple-macosx10.10/release/LispKitRepl

Requirements

The following technologies are needed to build the components of the LispKit framework. For the command-line tool, Xcode and Carthage are not strictly needed. Just for compiling the framework and trying the command-line tool in Xcode, the Swift Package Manager is not needed.

swift-lispkit's People

Contributors

objecthub avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.