diff --git a/src/Phsyche.package/Phsyche.class/instance/carBinding.st b/src/Phsyche.package/Phsyche.class/instance/carBinding.st new file mode 100644 index 0000000..f37c460 --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/carBinding.st @@ -0,0 +1,3 @@ +as yet unclassified +carBinding + ^ #car -> [ :l | l first ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/cdrBinding.st b/src/Phsyche.package/Phsyche.class/instance/cdrBinding.st new file mode 100644 index 0000000..92726ad --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/cdrBinding.st @@ -0,0 +1,3 @@ +as yet unclassified +cdrBinding + ^ #cdr -> [ :l | l allButFirst ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/consBinding.st b/src/Phsyche.package/Phsyche.class/instance/consBinding.st new file mode 100644 index 0000000..92c4b79 --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/consBinding.st @@ -0,0 +1,3 @@ +as yet unclassified +consBinding + ^ #cons -> [ :e :l | {e} , l ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/divBinding.st b/src/Phsyche.package/Phsyche.class/instance/divBinding.st new file mode 100644 index 0000000..4bcc678 --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/divBinding.st @@ -0,0 +1,3 @@ +as yet unclassified +divBinding + ^ #+ -> [ :e :v | e / v asFloat ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/eval.in..st b/src/Phsyche.package/Phsyche.class/instance/eval.in..st index 6089db4..7bbebe9 100644 --- a/src/Phsyche.package/Phsyche.class/instance/eval.in..st +++ b/src/Phsyche.package/Phsyche.class/instance/eval.in..st @@ -4,6 +4,12 @@ eval: expr in: environ expr isSymbol ifTrue: [ ^ environ at: expr ]. "returns the variable value" expr isArray ifFalse: [ ^ expr ] "returns literals boolean, string, number" ifTrue: [ - expr first = #define - ifTrue: [ ^ self evalDefine: expr in: environ ] + | fst | + fst := expr first. + (prims includes: fst) ifTrue: [ + ^ self evalPrim: expr in: environ + ]. "evaluates primitive" + fst = #define ifTrue: [ ^ self evalDefine: expr in: environ ]. "defines the value" + fst = #if ifTrue: [ ^ self evalIf: expr in: environ]. "evaluates if" + fst = #quote ifTrue: [ ^ expr second ]. "returns the value unevaluated" ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/evalIf.in..st b/src/Phsyche.package/Phsyche.class/instance/evalIf.in..st new file mode 100644 index 0000000..b571f78 --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/evalIf.in..st @@ -0,0 +1,5 @@ +as yet unclassified +evalIf: expr in: environ + ^ (self eval: expr second in: environ) + ifTrue: [ self eval: expr third in: environ ] + ifFalse: [ self eval: expr fourth in: environ ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/evalPrim.in..st b/src/Phsyche.package/Phsyche.class/instance/evalPrim.in..st new file mode 100644 index 0000000..e56bb01 --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/evalPrim.in..st @@ -0,0 +1,5 @@ +as yet unclassified +evalPrim: expr in: environ + | method | + method := (environ at: expr first). + ^ method valueWithArguments: (expr allButFirst collect: [ :x | self eval: x in: environ]) \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/greaterBinding.st b/src/Phsyche.package/Phsyche.class/instance/greaterBinding.st new file mode 100644 index 0000000..11d1dac --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/greaterBinding.st @@ -0,0 +1,3 @@ +as yet unclassified +greaterBinding + ^ #> -> [ :e :v | e > v ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/greaterOrEqualBinding.st b/src/Phsyche.package/Phsyche.class/instance/greaterOrEqualBinding.st new file mode 100644 index 0000000..e58477d --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/greaterOrEqualBinding.st @@ -0,0 +1,3 @@ +as yet unclassified +greaterOrEqualBinding + ^ #>= -> [ :e :v | e >= v ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/initialize.st b/src/Phsyche.package/Phsyche.class/instance/initialize.st index 42da799..87d0528 100644 --- a/src/Phsyche.package/Phsyche.class/instance/initialize.st +++ b/src/Phsyche.package/Phsyche.class/instance/initialize.st @@ -1,4 +1,6 @@ initialization initialize super initialize. - env := Dictionary new \ No newline at end of file + env := Dictionary new. + prims := OrderedCollection new. + self initializeEnvBindings \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/initializeEnvBindings.st b/src/Phsyche.package/Phsyche.class/instance/initializeEnvBindings.st new file mode 100644 index 0000000..2c732f9 --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/initializeEnvBindings.st @@ -0,0 +1,9 @@ +as yet unclassified +initializeEnvBindings + (self class selectors select: [ :each | each endsWithSubCollection: 'Binding' ]) + do: [ :s | + | binding | + binding := self perform: s. + prims add: binding key. + env at: binding key put: binding value + ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/isEqualBinding.st b/src/Phsyche.package/Phsyche.class/instance/isEqualBinding.st new file mode 100644 index 0000000..20af333 --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/isEqualBinding.st @@ -0,0 +1,3 @@ +as yet unclassified +isEqualBinding + ^ #equal -> [ :e :v | e = v ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/isNotBinding.st b/src/Phsyche.package/Phsyche.class/instance/isNotBinding.st new file mode 100644 index 0000000..0656af0 --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/isNotBinding.st @@ -0,0 +1,3 @@ +as yet unclassified +isNotBinding + ^ #not -> [ :a | a not ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/isNullBinding.st b/src/Phsyche.package/Phsyche.class/instance/isNullBinding.st new file mode 100644 index 0000000..1baed6c --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/isNullBinding.st @@ -0,0 +1,3 @@ +as yet unclassified +isNullBinding + ^ #isNull -> [ :l | l = #() ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/minusBinding.st b/src/Phsyche.package/Phsyche.class/instance/minusBinding.st new file mode 100644 index 0000000..ac392b3 --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/minusBinding.st @@ -0,0 +1,3 @@ +as yet unclassified +minusBinding + ^ #+ -> [ :e :v | e - v ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/multBinding.st b/src/Phsyche.package/Phsyche.class/instance/multBinding.st new file mode 100644 index 0000000..2490004 --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/multBinding.st @@ -0,0 +1,3 @@ +as yet unclassified +multBinding + ^ #* -> [ :e :v | e * v ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/plusBinding.st b/src/Phsyche.package/Phsyche.class/instance/plusBinding.st new file mode 100644 index 0000000..57a26be --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/plusBinding.st @@ -0,0 +1,3 @@ +as yet unclassified +plusBinding + ^ #+ -> [ :e :v | e + v ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/smallerOrEqualBinding.st b/src/Phsyche.package/Phsyche.class/instance/smallerOrEqualBinding.st new file mode 100644 index 0000000..b251b96 --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/smallerOrEqualBinding.st @@ -0,0 +1,3 @@ +as yet unclassified +smallerOrEqualBinding + ^ #<= -> [ :e :v | e <= v ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/properties.json b/src/Phsyche.package/Phsyche.class/properties.json index a877428..de12cc3 100644 --- a/src/Phsyche.package/Phsyche.class/properties.json +++ b/src/Phsyche.package/Phsyche.class/properties.json @@ -6,7 +6,8 @@ ], "commentStamp" : "VeitHeller 4/30/2018 16:32", "instvars" : [ - "env" ], + "env", + "prims" ], "name" : "Phsyche", "pools" : [ ], diff --git a/src/Phsyche.package/PhsycheTest.class/instance/testEvalCarExpressionEvaluatesItsArgument.st b/src/Phsyche.package/PhsycheTest.class/instance/testEvalCarExpressionEvaluatesItsArgument.st new file mode 100644 index 0000000..93ceaaf --- /dev/null +++ b/src/Phsyche.package/PhsycheTest.class/instance/testEvalCarExpressionEvaluatesItsArgument.st @@ -0,0 +1,5 @@ +tests +testEvalCarExpressionEvaluatesItsArgument + self + assert: (ph parseAndEval: '(car (cons (quote a) (cons (quote b) ())))') + equals: #a \ No newline at end of file diff --git a/src/Phsyche.package/PhsycheTest.class/instance/testEvalCdrExpressionEvaluatesItsArgument.st b/src/Phsyche.package/PhsycheTest.class/instance/testEvalCdrExpressionEvaluatesItsArgument.st new file mode 100644 index 0000000..f238f2f --- /dev/null +++ b/src/Phsyche.package/PhsycheTest.class/instance/testEvalCdrExpressionEvaluatesItsArgument.st @@ -0,0 +1,3 @@ +tests +testEvalCdrExpressionEvaluatesItsArgument + self assert: (ph parseAndEval: '(cdr (quote (quote a)))') equals: #(a) \ No newline at end of file diff --git a/src/Phsyche.package/PhsycheTest.class/instance/testEvalExpressionArith.st b/src/Phsyche.package/PhsycheTest.class/instance/testEvalExpressionArith.st new file mode 100644 index 0000000..22b6150 --- /dev/null +++ b/src/Phsyche.package/PhsycheTest.class/instance/testEvalExpressionArith.st @@ -0,0 +1,4 @@ +tests +testEvalExpressionArith + self assert: (ph parseAndEval: '(* (+ 2 3) 8)') equals: 40. + self assert: (ph parseAndEval: '(* 8 (+ 2 3))') equals: 40 \ No newline at end of file diff --git a/src/Phsyche.package/PhsycheTest.class/instance/testEvalExpressionMult.st b/src/Phsyche.package/PhsycheTest.class/instance/testEvalExpressionMult.st new file mode 100644 index 0000000..24e1c3d --- /dev/null +++ b/src/Phsyche.package/PhsycheTest.class/instance/testEvalExpressionMult.st @@ -0,0 +1,3 @@ +tests +testEvalExpressionMult + self assert: (ph parseAndEval: '(* 3 8)') equals: 24 \ No newline at end of file diff --git a/src/Phsyche.package/PhsycheTest.class/instance/testEvalIf.st b/src/Phsyche.package/PhsycheTest.class/instance/testEvalIf.st new file mode 100644 index 0000000..39f43d1 --- /dev/null +++ b/src/Phsyche.package/PhsycheTest.class/instance/testEvalIf.st @@ -0,0 +1,4 @@ +tests +testEvalIf + self assert: (ph parseAndEval: '(if true 4 5)') equals: 4. + self assert: (ph parseAndEval: '(if false 4 5)') equals: 5 \ No newline at end of file diff --git a/src/Phsyche.package/PhsycheTest.class/instance/testEvalListExpression.st b/src/Phsyche.package/PhsycheTest.class/instance/testEvalListExpression.st new file mode 100644 index 0000000..3905ba7 --- /dev/null +++ b/src/Phsyche.package/PhsycheTest.class/instance/testEvalListExpression.st @@ -0,0 +1,3 @@ +tests +testEvalListExpression + self assert: (ph parseAndEval: '(cons (quote a) ())') equals: #(a) \ No newline at end of file diff --git a/src/Phsyche.package/PhsycheTest.class/instance/testEvalQuote.st b/src/Phsyche.package/PhsycheTest.class/instance/testEvalQuote.st new file mode 100644 index 0000000..a18bfe3 --- /dev/null +++ b/src/Phsyche.package/PhsycheTest.class/instance/testEvalQuote.st @@ -0,0 +1,8 @@ +tests +testEvalQuote + self + assert: (ph parseAndEval: '(quote (* x x))') + equals: #(#* #x #x). + self + assert: (ph parseAndEval: '(quote (quote (* x x)))') + equals: #(quote #(#* #x #x)) \ No newline at end of file diff --git a/src/Phsyche.package/PhsycheTest.class/instance/testIsNull.st b/src/Phsyche.package/PhsycheTest.class/instance/testIsNull.st new file mode 100644 index 0000000..6acac8f --- /dev/null +++ b/src/Phsyche.package/PhsycheTest.class/instance/testIsNull.st @@ -0,0 +1,5 @@ +tests +testIsNull + self assert: (ph parseAndEval: '(isNull #())'). + self assert: (ph parseAndEval: '(isNull (quote ()))'). + self deny: (ph parseAndEval: '(isNull (cons (quote a) #()))') \ No newline at end of file diff --git a/src/Phsyche.package/PhsycheTest.class/instance/testNot.st b/src/Phsyche.package/PhsycheTest.class/instance/testNot.st new file mode 100644 index 0000000..e5b4dd0 --- /dev/null +++ b/src/Phsyche.package/PhsycheTest.class/instance/testNot.st @@ -0,0 +1,4 @@ +tests +testNot + self assert: (ph parseAndEval: '(not false)'). + self deny: (ph parseAndEval: '(not true)') \ No newline at end of file