Add support for evaluating BOOL and introduce basic logical operators as functions
This commit is contained in:
@@ -4,6 +4,8 @@ from smnp.program.interpreter import Interpreter
|
|||||||
|
|
||||||
|
|
||||||
def loadStandardLibrary():
|
def loadStandardLibrary():
|
||||||
source = resource_string('smnp.library.code', 'main.mus').decode("utf-8")
|
mainSource = resource_string('smnp.library.code', 'main.mus').decode("utf-8")
|
||||||
return Interpreter.interpretString(source)
|
boolSource = resource_string('smnp.library.code', 'bool.mus').decode("utf-8")
|
||||||
|
env = Interpreter.interpretString(mainSource)
|
||||||
|
return Interpreter.interpretString(boolSource, baseEnvironment=env)
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ def _function1(env, list, index):
|
|||||||
raise RuntimeException(f"Attempt to access item which is outside the list", None)
|
raise RuntimeException(f"Attempt to access item which is outside the list", None)
|
||||||
|
|
||||||
|
|
||||||
_signature2 = signature(ofType(Type.MAP), ofTypes(Type.INTEGER, Type.STRING, Type.NOTE, Type.TYPE))
|
_signature2 = signature(ofType(Type.MAP), ofTypes(Type.INTEGER, Type.STRING, Type.NOTE, Type.BOOL, Type.TYPE))
|
||||||
def _function2(env, map, key):
|
def _function2(env, map, key):
|
||||||
try:
|
try:
|
||||||
return map.value[key]
|
return map.value[key]
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from smnp.type.model import Type
|
|||||||
from smnp.type.signature.matcher.list import listOfMatchers, listMatches
|
from smnp.type.signature.matcher.list import listOfMatchers, listMatches
|
||||||
from smnp.type.signature.matcher.type import allTypes, ofTypes
|
from smnp.type.signature.matcher.type import allTypes, ofTypes
|
||||||
|
|
||||||
_signature1 = varargSignature(listMatches(ofTypes(Type.INTEGER, Type.STRING, Type.NOTE, Type.TYPE), allTypes()))
|
_signature1 = varargSignature(listMatches(ofTypes(Type.INTEGER, Type.STRING, Type.NOTE, Type.BOOL, Type.TYPE), allTypes()))
|
||||||
def _function1(env, vararg):
|
def _function1(env, vararg):
|
||||||
map = {}
|
map = {}
|
||||||
for entry in vararg:
|
for entry in vararg:
|
||||||
@@ -14,7 +14,7 @@ def _function1(env, vararg):
|
|||||||
return Type.map(map)
|
return Type.map(map)
|
||||||
|
|
||||||
|
|
||||||
_signature2 = signature(listOfMatchers(listMatches(ofTypes(Type.INTEGER, Type.STRING, Type.NOTE, Type.TYPE), allTypes())))
|
_signature2 = signature(listOfMatchers(listMatches(ofTypes(Type.INTEGER, Type.STRING, Type.NOTE, Type.BOOL, Type.TYPE), allTypes())))
|
||||||
def _function2(env, list):
|
def _function2(env, list):
|
||||||
map = {}
|
map = {}
|
||||||
for entry in list.value:
|
for entry in list.value:
|
||||||
|
|||||||
9
smnp/runtime/evaluators/bool.py
Normal file
9
smnp/runtime/evaluators/bool.py
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
from smnp.runtime.evaluator import Evaluator
|
||||||
|
from smnp.type.model import Type
|
||||||
|
|
||||||
|
|
||||||
|
class BoolEvaluator(Evaluator):
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def evaluator(cls, node, environment):
|
||||||
|
return Type.bool(node.value)
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
from smnp.ast.node.access import AccessNode
|
from smnp.ast.node.access import AccessNode
|
||||||
from smnp.ast.node.assignment import AssignmentNode
|
from smnp.ast.node.assignment import AssignmentNode
|
||||||
from smnp.ast.node.asterisk import AsteriskNode
|
from smnp.ast.node.asterisk import AsteriskNode
|
||||||
|
from smnp.ast.node.bool import BoolLiteralNode
|
||||||
from smnp.ast.node.identifier import IdentifierNode
|
from smnp.ast.node.identifier import IdentifierNode
|
||||||
from smnp.ast.node.integer import IntegerLiteralNode
|
from smnp.ast.node.integer import IntegerLiteralNode
|
||||||
from smnp.ast.node.invocation import FunctionCallNode
|
from smnp.ast.node.invocation import FunctionCallNode
|
||||||
@@ -28,11 +29,13 @@ def expressionEvaluator(doAssert=False):
|
|||||||
from smnp.runtime.evaluators.asterisk import AsteriskEvaluator
|
from smnp.runtime.evaluators.asterisk import AsteriskEvaluator
|
||||||
from smnp.runtime.evaluators.map import MapEvaluator
|
from smnp.runtime.evaluators.map import MapEvaluator
|
||||||
from smnp.runtime.evaluators.type import TypeEvaluator
|
from smnp.runtime.evaluators.type import TypeEvaluator
|
||||||
|
from smnp.runtime.evaluators.bool import BoolEvaluator
|
||||||
result = Evaluator.oneOf(
|
result = Evaluator.oneOf(
|
||||||
Evaluator.forNodes(FunctionCallEvaluator.evaluate, FunctionCallNode),
|
Evaluator.forNodes(FunctionCallEvaluator.evaluate, FunctionCallNode),
|
||||||
Evaluator.forNodes(StringEvaluator.evaluate, StringLiteralNode),
|
Evaluator.forNodes(StringEvaluator.evaluate, StringLiteralNode),
|
||||||
Evaluator.forNodes(IntegerEvaluator.evaluate, IntegerLiteralNode),
|
Evaluator.forNodes(IntegerEvaluator.evaluate, IntegerLiteralNode),
|
||||||
Evaluator.forNodes(NoteEvaluator.evaluate, NoteLiteralNode),
|
Evaluator.forNodes(NoteEvaluator.evaluate, NoteLiteralNode),
|
||||||
|
Evaluator.forNodes(BoolEvaluator.evaluate, BoolLiteralNode),
|
||||||
Evaluator.forNodes(TypeEvaluator.evaluate, TypeNode),
|
Evaluator.forNodes(TypeEvaluator.evaluate, TypeNode),
|
||||||
Evaluator.forNodes(IdentifierEvaluator.evaluate, IdentifierNode),
|
Evaluator.forNodes(IdentifierEvaluator.evaluate, IdentifierNode),
|
||||||
Evaluator.forNodes(ListEvaluator.evaluate, ListNode),
|
Evaluator.forNodes(ListEvaluator.evaluate, ListNode),
|
||||||
|
|||||||
@@ -54,6 +54,10 @@ class Type(Enum):
|
|||||||
"dot": Type.string('.' if value.dot else '')
|
"dot": Type.string('.' if value.dot else '')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def bool(value):
|
||||||
|
return Value(Type.BOOL, value, {})
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def sound(value):
|
def sound(value):
|
||||||
return Value(Type.SOUND, value, {
|
return Value(Type.SOUND, value, {
|
||||||
|
|||||||
Reference in New Issue
Block a user