From 92a2ecbd8e58e0ed2f296e12737c99d6dcda652c Mon Sep 17 00:00:00 2001 From: hellerve Date: Mon, 30 Apr 2018 16:48:27 +0200 Subject: [PATCH] evaluator: add environment, make definitions work, add tests --- src/Phsyche.package/Phsyche.class/instance/eval..st | 4 ++-- src/Phsyche.package/Phsyche.class/instance/eval.in..st | 10 ++++++++-- .../Phsyche.class/instance/evalDefine.in..st | 5 +++++ .../Phsyche.class/instance/initialize.st | 4 ++++ src/Phsyche.package/Phsyche.class/instance/parse..st | 6 +++--- .../Phsyche.class/instance/parseAndEval..st | 4 ++-- .../PhsycheTest.class/instance/testDefineExpression.st | 6 ++++++ .../instance/testEvalExpressionReassignment.st | 6 ++++++ 8 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 src/Phsyche.package/Phsyche.class/instance/evalDefine.in..st create mode 100644 src/Phsyche.package/Phsyche.class/instance/initialize.st create mode 100644 src/Phsyche.package/PhsycheTest.class/instance/testDefineExpression.st create mode 100644 src/Phsyche.package/PhsycheTest.class/instance/testEvalExpressionReassignment.st diff --git a/src/Phsyche.package/Phsyche.class/instance/eval..st b/src/Phsyche.package/Phsyche.class/instance/eval..st index e86f908..a4e0db8 100644 --- a/src/Phsyche.package/Phsyche.class/instance/eval..st +++ b/src/Phsyche.package/Phsyche.class/instance/eval..st @@ -1,3 +1,3 @@ as yet unclassified -eval: expression - ^ self eval: expression in: nil \ No newline at end of file +eval: expr + ^ self eval: expr in: env \ 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 d563e43..6089db4 100644 --- a/src/Phsyche.package/Phsyche.class/instance/eval.in..st +++ b/src/Phsyche.package/Phsyche.class/instance/eval.in..st @@ -1,3 +1,9 @@ as yet unclassified -eval: expression in: anEnvironment - ^ expression \ No newline at end of file +eval: expr in: environ + expr = #() ifTrue: [ ^ expr ]. + 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 ] + ] \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/evalDefine.in..st b/src/Phsyche.package/Phsyche.class/instance/evalDefine.in..st new file mode 100644 index 0000000..2884d2e --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/evalDefine.in..st @@ -0,0 +1,5 @@ +as yet unclassified +evalDefine: expr in: environ + environ at: expr second + put: (self eval: expr third in: environ). + ^ #undefined \ 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 new file mode 100644 index 0000000..42da799 --- /dev/null +++ b/src/Phsyche.package/Phsyche.class/instance/initialize.st @@ -0,0 +1,4 @@ +initialization +initialize + super initialize. + env := Dictionary new \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/parse..st b/src/Phsyche.package/Phsyche.class/instance/parse..st index 27613f8..9a401a0 100644 --- a/src/Phsyche.package/Phsyche.class/instance/parse..st +++ b/src/Phsyche.package/Phsyche.class/instance/parse..st @@ -1,4 +1,4 @@ as yet unclassified -parse: aProgramString - aProgramString ifEmpty: [ ^ #() ]. - ^ (Scanner new scanTokens: aProgramString) first \ No newline at end of file +parse: prog + prog ifEmpty: [ ^ #() ]. + ^ (Scanner new scanTokens: prog) first \ No newline at end of file diff --git a/src/Phsyche.package/Phsyche.class/instance/parseAndEval..st b/src/Phsyche.package/Phsyche.class/instance/parseAndEval..st index 7d85bf1..93ccf53 100644 --- a/src/Phsyche.package/Phsyche.class/instance/parseAndEval..st +++ b/src/Phsyche.package/Phsyche.class/instance/parseAndEval..st @@ -1,3 +1,3 @@ as yet unclassified -parseAndEval: anExpression - ^ self eval: (self parse: anExpression) \ No newline at end of file +parseAndEval: expr + ^ self eval: (self parse: expr) \ No newline at end of file diff --git a/src/Phsyche.package/PhsycheTest.class/instance/testDefineExpression.st b/src/Phsyche.package/PhsycheTest.class/instance/testDefineExpression.st new file mode 100644 index 0000000..8f89216 --- /dev/null +++ b/src/Phsyche.package/PhsycheTest.class/instance/testDefineExpression.st @@ -0,0 +1,6 @@ +tests +testDefineExpression + ph parseAndEval: '(define pi 3.14)'. + self + assert: (ph parseAndEval: 'pi') + equals: 3.14 \ No newline at end of file diff --git a/src/Phsyche.package/PhsycheTest.class/instance/testEvalExpressionReassignment.st b/src/Phsyche.package/PhsycheTest.class/instance/testEvalExpressionReassignment.st new file mode 100644 index 0000000..e0d81e4 --- /dev/null +++ b/src/Phsyche.package/PhsycheTest.class/instance/testEvalExpressionReassignment.st @@ -0,0 +1,6 @@ +tests +testEvalExpressionReassignment + ph parseAndEval: '(define pi 3.14)'. + ph parseAndEval: '(define pi2 pi)'. + ph parseAndEval: '(define pi 6.28)'. + self assert: (ph parseAndEval: 'pi2') equals: 3.14 \ No newline at end of file