I have released daonode on npm and https://github.com/chaosim/daonode
To use daonode, just:
npm install daonode

Dao is a functional logic solver, unifying code with data, grammar with 
program, logic with functional, compiling with running.
Daonode is a porting, rewriting and upgrading from python to coffeecript(so 
just javscript) of the dao project.
What would happen when lisp meets prolog in javascript?  

some examples (the code is extracted from the coffeescript tests):

    "test builtin function": (test) ->
        add = fun(2, (x, y) -> x+y)
        test.equal  solve(add(1, add(1,1)), 3

    "test macro": (test) ->
        orpm = macro((x, y) -> orp(x, y))
        test.equal  solve(orpm(fail, print_(2))), null

    "test macro tofun": (test) ->
        orpm = macro(2, (x, y) -> orp(x, y))
        test.equal  solve(orpm(print_(1), print_(2))), null
        test.equal  solve(tofun(orpm)(print_(1), print_(2))), null
        test.equal  solve(tofun(orpm)(quote(print_(1)), quote(print_(2)))), 
null

    "test proc,aka online function in dao": (test) ->
        a = proc(0, 'a', () ->
          i = 0
          add(1, 2))
        test.equal solve(a()), 3

    "test eval_ quote": (test) ->
        exp = if_(1, 2, 3)
        test.equal  solve(quote(exp)), exp
        test.equal  solve(eval_(quote(exp))), 2

    "test lisp style catch/throw ": (test) ->
        test.equal  solve(catch_(1, 2)), 2
        test.equal  solve(catch_(1, throw_(1, 2), 3)), 2
        test.equal(solve(block('foo', protect(break_('foo', 1), 
print_(2)))), 1)
        test.equal(solve(block('foo', protect(break_('foo', 1),  print_(2), 
print_(3)))), 1)

    "test callcc2": (test) ->
        a = null
        solve(begin(callcc((k) -> a = k), add(1, 2)))
        test.equal a(null), 3

    "test callfc": (test) ->
        a = null
        x = vari('x')
        x.binding = 5
        solve(orp(callfc((k) -> a = k), add(x, 2)))
        test.equal a(null), 7

    "test quasiquote": (test) ->
        test.equal solve(qq(1)), 1
        a = add(1, 2)
        test.deepEqual solve(qq(a)), a
        test.deepEqual solve(qq(uq(a))), 3
        test.deepEqual solve(qq(uqs([1,2]))), new UnquoteSliceValue([1,2])
        test.deepEqual solve(qq(add(uqs([1,2])))), a

    "test block break continue": (test) ->
        test.equal  solve(block('a', 1)), 1
        test.equal  solve(block('a', break_('a', 2), 1)), 2
        test.equal  solve(block('a', block('b', break_('b', 2), 1), 3)), 3
        a = vari('a')
        test.equal  solve(begin(assign(a, 1),  block('a', if_(eq(a, 5), 
break_('a', a)), inc(a), continue_('a')))), 5

    "test logic predicate": (test) ->
        test.equal(solve(andp(unify(a, 1))), true)
        test.equal  (solve(andp(unify(a, 1), unify(a, 2))), false)
        test.equal  solve(orp(andp(unify(a, 1), unify(a, 2)), unify(a, 
2))), true
       test.equal  (solve(orp(findall(orp(print_(1), print_(2))),)
                               print_(3))), null
       test.equal  (solve(findall(once(orp(print_(1), (print_(2)))))), null)

    "test logic rule": (test) ->
        r = rule(2, (x, y) ->
          [[x,y], 1, null])
        test.equal  solve(r(1,1)), 1

    "test parser builtins": (test) ->
        test.deepEqual  (solve(begin(settext('ab'), any(char(_), result, 
_), eoi, result)), ['a', 'b'])
        test.equal  (solve(parsetext(begin(some(char(_)), char('c'), eoi), 
'abc')), true)
        test.deepEqual  (solve(begin(parsetext(seplist(char(_), 
{sep:char(','), times:n, result:result, template:_}), 'a,b,c'), result)), 
['a', 'b','c'])
        test.deepEqual  (solve(begin(parsetext(andp(seplist(char(_), 
{sep:char(','), times:n, result:result, template:_}), char(','), char('b'), 
char(','), char('c')), 'a,b,c'), result)), ['a'])

-- 
-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to