61 lines
1.2 KiB
CoffeeScript
61 lines
1.2 KiB
CoffeeScript
{car, cdr, cons, listp, pairp, nilp,
|
|
nil, list, listToString} = require './lists'
|
|
|
|
|
|
length = (lst, l = 0) ->
|
|
return l if (nilp lst)
|
|
length (cdr lst), (l + 1)
|
|
|
|
|
|
reduce = (lst, iteratee, memo, context) ->
|
|
count = 0
|
|
console.log lst
|
|
return memo if nilp lst
|
|
memo = iteratee.call(context, memo, (car lst), count)
|
|
lst = cdr lst
|
|
count++
|
|
while not nilp lst
|
|
memo = iteratee.call(context, memo, (car lst), count)
|
|
count++
|
|
lst = cdr lst
|
|
null
|
|
memo
|
|
|
|
|
|
map = (lst, iteratee, context, count = 0) ->
|
|
return nil if nilp lst
|
|
product = iteratee.call(context, (car lst), count, lst)
|
|
rest = if (nilp cdr lst) then nil else
|
|
map((cdr lst), iteratee, context, count + 1)
|
|
cons product, rest
|
|
|
|
|
|
rmap = (lst, iteratee, context, count = 0) ->
|
|
ptr = lst
|
|
ret = cons()
|
|
while not nilp ptr
|
|
ret = cons (car ptr), ret
|
|
ptr = cdr ptr
|
|
ret
|
|
|
|
|
|
reverse = (lst) -> rmap lst, (i) -> i
|
|
|
|
|
|
filter = (lst, iteratee, context) ->
|
|
return nil if nilp lst
|
|
if iteratee.call(context, (car lst), lst)
|
|
cons (car lst), (filter (cdr lst), iteratee, context)
|
|
else
|
|
filter (cdr lst), iteratee, context
|
|
|
|
|
|
module.exports =
|
|
length: length
|
|
reduce: reduce
|
|
map: map
|
|
rmap: rmap
|
|
filter: filter
|
|
reverse: reverse
|
|
|