nydp 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +58 -0
- data/Rakefile +1 -0
- data/bin/nydp +5 -0
- data/bin/nydp-tests +5 -0
- data/lib/lisp/boot.nydp +219 -0
- data/lib/lisp/test-runner.nydp +39 -0
- data/lib/lisp/tests/foundation-test.nydp +28 -0
- data/lib/nydp.rb +143 -0
- data/lib/nydp/assignment.rb +40 -0
- data/lib/nydp/builtin.rb +8 -0
- data/lib/nydp/builtin/apply.rb +16 -0
- data/lib/nydp/builtin/car.rb +5 -0
- data/lib/nydp/builtin/cdr.rb +5 -0
- data/lib/nydp/builtin/cdr_set.rb +8 -0
- data/lib/nydp/builtin/comment.rb +5 -0
- data/lib/nydp/builtin/cons.rb +16 -0
- data/lib/nydp/builtin/divide.rb +13 -0
- data/lib/nydp/builtin/error.rb +6 -0
- data/lib/nydp/builtin/eval.rb +14 -0
- data/lib/nydp/builtin/greater_than.rb +10 -0
- data/lib/nydp/builtin/hash.rb +30 -0
- data/lib/nydp/builtin/inspect.rb +5 -0
- data/lib/nydp/builtin/is_equal.rb +5 -0
- data/lib/nydp/builtin/less_than.rb +10 -0
- data/lib/nydp/builtin/millisecs.rb +7 -0
- data/lib/nydp/builtin/minus.rb +13 -0
- data/lib/nydp/builtin/plus.rb +28 -0
- data/lib/nydp/builtin/pre_compile.rb +5 -0
- data/lib/nydp/builtin/puts.rb +7 -0
- data/lib/nydp/builtin/quit.rb +5 -0
- data/lib/nydp/builtin/random_string.rb +11 -0
- data/lib/nydp/builtin/times.rb +13 -0
- data/lib/nydp/builtin/to_string.rb +12 -0
- data/lib/nydp/builtin/to_sym.rb +21 -0
- data/lib/nydp/builtin/vm_info.rb +13 -0
- data/lib/nydp/closure.rb +17 -0
- data/lib/nydp/compiler.rb +49 -0
- data/lib/nydp/cond.rb +56 -0
- data/lib/nydp/context_symbol.rb +22 -0
- data/lib/nydp/error.rb +4 -0
- data/lib/nydp/function_invocation.rb +52 -0
- data/lib/nydp/helper.rb +32 -0
- data/lib/nydp/interpreted_function.rb +79 -0
- data/lib/nydp/lexical_context.rb +38 -0
- data/lib/nydp/literal.rb +40 -0
- data/lib/nydp/pair.rb +112 -0
- data/lib/nydp/parser.rb +123 -0
- data/lib/nydp/string_atom.rb +24 -0
- data/lib/nydp/string_token.rb +21 -0
- data/lib/nydp/symbol.rb +47 -0
- data/lib/nydp/symbol_lookup.rb +43 -0
- data/lib/nydp/tokeniser.rb +80 -0
- data/lib/nydp/truth.rb +37 -0
- data/lib/nydp/version.rb +3 -0
- data/lib/nydp/vm.rb +76 -0
- data/nydp.gemspec +27 -0
- data/spec/boot_spec.rb +119 -0
- data/spec/embedded_spec.rb +106 -0
- data/spec/nypd_spec.rb +127 -0
- data/spec/pair_spec.rb +102 -0
- data/spec/parser_spec.rb +191 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/symbol_spec.rb +32 -0
- metadata +176 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
module Nydp
|
2
|
+
class AssignmentInstruction
|
3
|
+
def initialize name
|
4
|
+
@name = name
|
5
|
+
end
|
6
|
+
|
7
|
+
def execute vm
|
8
|
+
@name.assign vm.peek_arg, vm.peek_context
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
"#assign #{@name}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class Assignment
|
17
|
+
include Helper
|
18
|
+
|
19
|
+
def self.build args, bindings
|
20
|
+
name = Compiler.compile args.car, bindings
|
21
|
+
raise "can't assign to #{name.inspect} : expression was #{args}" unless name.respond_to?(:assign)
|
22
|
+
value_expr = args.cdr.car
|
23
|
+
Assignment.new name, Compiler.compile(value_expr, bindings), value_expr
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize name, value, value_src
|
27
|
+
@value_src = value_src
|
28
|
+
n = AssignmentInstruction.new name
|
29
|
+
@instructions = cons(value, cons(n))
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_s
|
33
|
+
"#assignment #{@instructions.cdr.car} #{@value_src}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def execute vm
|
37
|
+
vm.push_instructions @instructions, vm.peek_context
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/nydp/builtin.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
class Nydp::Builtin::Apply
|
2
|
+
include Nydp::Helper
|
3
|
+
|
4
|
+
def invoke vm, args
|
5
|
+
args.car.invoke vm, apply_args(args.cdr)
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def apply_args args
|
11
|
+
raise "Apply: expected a list : got #{args.inspect}" unless pair? args
|
12
|
+
raise "Apply: improper list : cdr is ruby nil" if args.cdr.nil?
|
13
|
+
return args.car if Nydp.NIL.is? args.cdr
|
14
|
+
cons args.car, apply_args(args.cdr)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Nydp::Builtin
|
2
|
+
class Cons
|
3
|
+
def invoke vm, args
|
4
|
+
vm.push_arg Nydp::Pair.new(args.car, args.cdr.car)
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
class IsPair
|
9
|
+
include Nydp::Helper
|
10
|
+
def invoke vm, args
|
11
|
+
arg = args.car
|
12
|
+
result = pair?(arg) ? Nydp.T : Nydp.NIL
|
13
|
+
vm.push_arg result
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class Nydp::Builtin::GreaterThan
|
2
|
+
def invoke vm, args
|
3
|
+
vm.push_arg (greater_than(args.car, args.cdr) ? Nydp.T : Nydp.NIL)
|
4
|
+
end
|
5
|
+
|
6
|
+
def greater_than arg, args
|
7
|
+
return true if Nydp.NIL.is? args
|
8
|
+
(arg > args.car) && greater_than(args.car, args.cdr)
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
class Nydp::Builtin::Hash
|
2
|
+
def invoke vm, args
|
3
|
+
vm.push_arg({ })
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
class Nydp::Builtin::HashGet
|
8
|
+
def invoke vm, args
|
9
|
+
hash = args.car
|
10
|
+
key = args.cdr.car
|
11
|
+
vm.push_arg(hash[key] || Nydp.NIL)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class Nydp::Builtin::HashSet
|
16
|
+
def invoke vm, args
|
17
|
+
hash = args.car
|
18
|
+
key = args.cdr.car
|
19
|
+
value = args.cdr.cdr.car
|
20
|
+
hash[key] = value
|
21
|
+
vm.push_arg value
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class Nydp::Builtin::HashKeys
|
26
|
+
def invoke vm, args
|
27
|
+
hash = args.car
|
28
|
+
vm.push_arg Nydp::Pair.from_list hash.keys
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class Nydp::Builtin::Plus
|
2
|
+
def invoke vm, args
|
3
|
+
vm.push_arg sum(args, origin(args.car))
|
4
|
+
end
|
5
|
+
|
6
|
+
def sum args, accum
|
7
|
+
if Nydp.NIL.is? args
|
8
|
+
accum
|
9
|
+
else
|
10
|
+
sum(args.cdr, (accum + args.car))
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def origin obj
|
15
|
+
case obj
|
16
|
+
when Fixnum
|
17
|
+
0
|
18
|
+
when Nydp::Pair
|
19
|
+
Nydp.NIL
|
20
|
+
when String, Nydp::StringAtom
|
21
|
+
Nydp::StringAtom.new ""
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s
|
26
|
+
"Builtin:+"
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class Nydp::Builtin::RandomString
|
2
|
+
@@random_chars = ["A","B","C","D","E","F","G","H","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z","2","3","4","5","6","7","8","9"]
|
3
|
+
|
4
|
+
def invoke vm, args
|
5
|
+
s = ""
|
6
|
+
1.upto(10) {
|
7
|
+
s << @@random_chars[rand(@@random_chars.size)]
|
8
|
+
}
|
9
|
+
Nydp::StringAtom.new s
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Nydp::Builtin::ToSym
|
2
|
+
def initialize ns
|
3
|
+
@ns = ns
|
4
|
+
end
|
5
|
+
def invoke vm, args
|
6
|
+
arg = args.car
|
7
|
+
val = case arg.class
|
8
|
+
when Nydp::Symbol
|
9
|
+
arg
|
10
|
+
else
|
11
|
+
Nydp::Symbol.mk arg.to_s.to_sym, @ns
|
12
|
+
end
|
13
|
+
vm.push_arg val
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class Nydp::Builtin::VmInfo
|
2
|
+
VMINFO_NS = { }
|
3
|
+
CONTEXTS = Nydp::Symbol.mk :contexts, VMINFO_NS
|
4
|
+
INSTRUCTIONS = Nydp::Symbol.mk :instructions, VMINFO_NS
|
5
|
+
ARGS = Nydp::Symbol.mk :args, VMINFO_NS
|
6
|
+
|
7
|
+
def invoke vm, args
|
8
|
+
context_count = Nydp::Pair.new CONTEXTS, vm.contexts.size
|
9
|
+
instruction_count = Nydp::Pair.new INSTRUCTIONS, vm.instructions.size
|
10
|
+
arg_count = Nydp::Pair.new ARGS, vm.args.size
|
11
|
+
vm.push_arg Nydp::Pair.from_list [context_count, instruction_count, arg_count]
|
12
|
+
end
|
13
|
+
end
|
data/lib/nydp/closure.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Nydp
|
2
|
+
class Closure
|
3
|
+
attr_accessor :ifn, :context
|
4
|
+
|
5
|
+
def initialize ifn, context
|
6
|
+
@ifn, @context = ifn, context
|
7
|
+
end
|
8
|
+
|
9
|
+
def invoke vm, arg_values
|
10
|
+
ifn.invoke vm, context, arg_values
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
"(closure #{context.inspect} : #{ifn.to_s})"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'nydp/cond'
|
2
|
+
require 'nydp/function_invocation'
|
3
|
+
require 'nydp/interpreted_function'
|
4
|
+
require 'nydp/literal'
|
5
|
+
|
6
|
+
module Nydp
|
7
|
+
class Compiler
|
8
|
+
extend Helper
|
9
|
+
|
10
|
+
def self.compile expression, bindings
|
11
|
+
if expression.is_a? Nydp::Symbol
|
12
|
+
SymbolLookup.build expression, bindings
|
13
|
+
elsif literal? expression
|
14
|
+
Literal.build expression, bindings
|
15
|
+
elsif expression.is_a? Nydp::Pair
|
16
|
+
compile_pair expression, bindings
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.maybe_cons a, b
|
21
|
+
Nydp.NIL.is?(a) ? b : cons(a, b)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.compile_each expr, bindings
|
25
|
+
if Nydp.NIL.is?(expr)
|
26
|
+
expr
|
27
|
+
elsif pair?(expr)
|
28
|
+
maybe_cons compile(expr.car, bindings), compile_each(expr.cdr, bindings)
|
29
|
+
else
|
30
|
+
compile(expr, bindings)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.compile_pair expression, bindings
|
35
|
+
key = expression.car
|
36
|
+
if sym?(key, :cond)
|
37
|
+
Cond.build expression.cdr, bindings
|
38
|
+
elsif sym?(key, :quote)
|
39
|
+
Literal.build expression.cadr, bindings
|
40
|
+
elsif sym?(key, :assign)
|
41
|
+
Assignment.build expression.cdr, bindings
|
42
|
+
elsif sym?(key, :fn)
|
43
|
+
InterpretedFunction.build expression.cadr, expression.cddr, bindings
|
44
|
+
else
|
45
|
+
FunctionInvocation.build expression, bindings
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|