Created a secretive inheritance method for the compiler. You

don't need to see this, move along...
This commit is contained in:
Elf M. Sternberg 2016-04-29 07:17:52 -07:00
parent d23c849cf9
commit 950ea513c7
2 changed files with 90 additions and 67 deletions

View File

@ -6,3 +6,14 @@
PROJECT_ROOT=`pwd`
PATH="$PROJECT_ROOT/bin:$PROJECT_ROOT/node_modules/.bin:$PATH"
export PATH
if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
_OLD_VIRTUAL_PS1="$PS1"
if [ "x" != x ] ; then
PS1="$PS1"
else
PS1="(`basename \"$PROJECT_ROOT\"`)$PS1"
fi
export PS1
fi

View File

@ -34,73 +34,85 @@ ConsList = ->
writeable: false
list
nil = (-> new ConsList())()
_annotate = (ConsList) ->
nilp = (c) -> !!c.isList and c.length == 0
cons = (a = nil, b = nil) ->
return (new ConsList()) if (nilp a) and (nilp b)
if (a) then (new ConsList(a, b)) else (new ConsList(b))
nil = (-> new ConsList())()
vectorp = (c) -> toString.call(c) == '[object Array]'
cellp = (c) -> !!c.isList
pairp = (c) -> !!c.isList and (c.length == 2)
listp = (c) -> !!c.isList and (c.length == 2) and (cellp cdr c)
recordp = (c) -> Object.prototype.toString.call(c) == '[object Object]'
car = (c) -> c[0]
cdr = (c) -> c[1]
vectorToList = (v, p) ->
p = if p? then p else 0
if p >= v.length then return nil
# Annoying, but since lists are represented as nested arrays, they
# have to be intercepted first. The use of duck-typing here is
# frustrating.
item = if pairp(v[p]) then v[p] else
if vectorp(v[p]) then vectorToList(v[p]) else v[p]
cons(item, vectorToList(v, p + 1))
list = (v...) ->
ln = v.length
(nl = (a) ->
cons(v[a], if (a < ln) then (nl(a + 1)) else nil))(0)
listToVector = (l, v = []) ->
return v if nilp l
v.push if pairp (car l) then listToVector(car l) else (car l)
listToVector (cdr l), v
metacadr = (m) ->
ops = {'a': car, 'd': cdr}
seq = vectorToList m.match(/c([ad]+)r/)[1].split('').reverse()
return (l) ->
inner = (l, s) ->
return l if (nilp l) or (nilp s)
inner ops[(car s)](l), (cdr s)
inner l, seq
vectorp = (c) -> toString.call(c) == '[object Array]'
cellp = (c) -> !!c.isList
pairp = (c) -> !!c.isList and (c.length == 2)
listp = (c) -> !!c.isList and (c.length == 2) and (cellp cdr c)
recordp = (c) -> Object.prototype.toString.call(c) == '[object Object]'
nilp = (c) -> !!c.isList and c.length == 0
{
cons: cons
nil: nil
car: car
cdr: cdr
list: list
nilp: nilp
cellp: cellp
pairp: pairp
listp: listp
vectorToList: vectorToList
listToVector: listToVector
setcar: (a, l) -> l[0] = a; a
setcdr: (a, l) -> l[1] = a; a
cadr: (l) -> car (cdr l)
cddr: (l) -> cdr (cdr l)
cdar: (l) -> cdr (car l)
caar: (l) -> car (car l)
caddr: (l) -> car (cdr (cdr l))
cdddr: (l) -> cdr (cdr (cdr l))
cadar: (l) -> car (cdr (car l))
cddar: (l) -> cdr (cdr (car l))
caadr: (l) -> car (car (cdr l))
cdadr: (l) -> cdr (car (cdr l))
metacadr: metacadr
}
cons = (a = nil, b = nil) ->
return (new ConsList()) if (nilp a) and (nilp b)
if (a) then (new ConsList(a, b)) else (new ConsList(b))
_export = _annotate(ConsList)
Object.defineProperty _export, '_annotate',
value: _annotate
configurable: false,
enumerable: false,
writeable: false
car = (c) -> c[0]
cdr = (c) -> c[1]
vectorToList = (v, p) ->
p = if p? then p else 0
if p >= v.length then return nil
# Annoying, but since lists are represented as nested arrays, they
# have to be intercepted first. The use of duck-typing here is
# frustrating.
item = if pairp(v[p]) then v[p] else
if vectorp(v[p]) then vectorToList(v[p]) else v[p]
cons(item, vectorToList(v, p + 1))
list = (v...) ->
ln = v.length
(nl = (a) ->
cons(v[a], if (a < ln) then (nl(a + 1)) else nil))(0)
listToVector = (l, v = []) ->
return v if nilp l
v.push if pairp (car l) then listToVector(car l) else (car l)
listToVector (cdr l), v
metacadr = (m) ->
ops = {'a': car, 'd': cdr}
seq = vectorToList m.match(/c([ad]+)r/)[1].split('').reverse()
return (l) ->
inner = (l, s) ->
return l if (nilp l) or (nilp s)
inner ops[(car s)](l), (cdr s)
inner l, seq
module.exports =
cons: cons
nil: nil
car: car
cdr: cdr
list: list
nilp: nilp
cellp: cellp
pairp: pairp
listp: listp
vectorToList: vectorToList
listToVector: listToVector
setcar: (a, l) -> l[0] = a; a
setcdr: (a, l) -> l[1] = a; a
cadr: (l) -> car (cdr l)
cddr: (l) -> cdr (cdr l)
cdar: (l) -> cdr (car l)
caar: (l) -> car (car l)
caddr: (l) -> car (cdr (cdr l))
cdddr: (l) -> cdr (cdr (cdr l))
cadar: (l) -> car (cdr (car l))
cddar: (l) -> cdr (cdr (car l))
caadr: (l) -> car (car (cdr l))
cdadr: (l) -> cdr (car (cdr l))
metacadr: metacadr
module.exports = _export