A simple Javascript implementation of Lisp-like cons lists, as faithful as I could think. #complete
Go to file
Elf M. Sternberg 99abd47e34 Fixed a cons falsity issue, and tests for nested vectors.
It should be possible to create non-nested vector collections; this
will be critical for defining the basic structures for the compiler.

cons(null, ()) should be legal; cons(undefined, ()) should not.  This
is now supported in the code.
2016-05-03 12:38:57 -07:00
bin Created a secretive inheritance method for the compiler. You 2016-04-29 07:17:52 -07:00
src Fixed a cons falsity issue, and tests for nested vectors. 2016-05-03 12:38:57 -07:00
test Fixed a cons falsity issue, and tests for nested vectors. 2016-05-03 12:38:57 -07:00
.gitignore Changed the list structure to not respect cons(nil, nil) == nil. 2015-06-22 17:03:21 -07:00
LICENSE Better License file. Yikes! 2015-06-29 18:12:27 -07:00
Makefile Better License file. Yikes! 2015-06-29 18:12:27 -07:00
README.md Better README 2015-06-29 18:10:58 -07:00
package.json Updating package.json to include Coffeescript correctly. 2015-06-22 19:47:35 -07:00



A Javascript1 implementation of Lisp-like cons(), using vectors

1Technically, Coffeescript, but it's just Javascript.


I kinda got tired of my broken list implementations that I was working with in each and every variant of Lisp I wrote while working my way through List In Small Pieces, so I decided to break it out into its own managed repo.


A cons is a singly-link list consisting of pairs, two-position objects. In a true cons list, the leftmost cell (the "car") contains a data object of interest, and the rightmost cell (the "cdr") contains a pointer to the next pair. Cons lists traditionally end with a cdr object pointing to an empty list. The following functions are provided to create, identify, traverse, and modify cons lists.

  • nil : An empty list, used as a static sentinel
  • cons() : Construct an empty list
  • cons(obj): Create a new list of one object
  • cons(obj, lst): Append an object to the head of an existing list
  • car(lst): Return the contents of the current cell, or nil.
  • cdr(lst): Return a reference to the next item in the list, or nil.
  • nilp(lst): (Boolean) is list an empty list?
  • pairp(obj): (Boolean) is this a object a pair?
  • listp(obj): (Boolean) is this object a list?
  • list(a, b, ...): Construct a list out of the arguments
  • vectorToList(v): Return a cons list given a vector. Recursive: if a vector is encountered inside v, it will be converted to a cons list.
  • listToVector(l): Return a vector given a cons list. Recursive: if car(l) is itself a cons list, the returned vector will contain an internal vector at that position.
  • setcar(obj, l): Replace the contents of car(l) with obj
  • setcdr(obj, l): Replace the contents of cdr(l) with obj
  • cadr(lst), cddr(lst), cdar(lst), caar(lst), caddr(lst), cdddr(lst), cadar(lst), cddar(lst), caadr(lst), cdadr(lst): Common lisp functions that extend standard list addressing.
  • metacadr(string): For more complex addressing, metacadr() can be provided with a string that describes the address desired, and returns the qualifying function. For example, this library does not provide caddddr(), but it can easily be generated: metacadr("caddddr") will return a function to get the data content of the fifth cell.


  • coffee-script to compile the library.
  • chai, mocha, coffeelint, mocha-jenkins-reporter for development.

See package.json for details.


npm install https://github.com/elfsternberg/cons-lists.git


Elf M. Sternberg elf.sternberg@gmail.com

Copyright (c) 2015 Elf M. Sternberg

Licensed under the MIT License. See the LICENSE file for full text.