class Ven::Machine

Included Modules

Defined in:

ven/eval.cr

Constant Summary

B_FALSE = MBool.new(false)
B_TRUE = MBool.new(true)

Ven booleans are structs (copy on use). There is no need for the .news everywhere (?)

MAX_CALL_DEPTH = 512

Maximum call depth (see #call).

Constructors

Instance Method Summary

Instance methods inherited from class Ven::Suite::Visitor

last=(last : Quote) last=, visit(quote : Quote)
visit(quotes : Quotes)
visit
, visit!(quote : _) visit!

Constructor Detail

def self.new #

[View source]

Instance Method Detail

def binary(operator, left : Model, right : Model) #

Applies binary operator to left and right.


[View source]
def call(callee : MBox, args : Models) #

Instantiates an MBox with arguments args.


[View source]
def call(callee : MConcreteFunction, args : Models, typecheck = true, generic = false) : Model #

Calls an MConcreteFunction with args, checking their types if typecheck is true. generic determines the behavior of 'next': if set to true, 'next' would not be captured.


[View source]
def call(callee : MGenericFunction, args) : Model #

Calls an MGenericFunction with args.


[View source]
def call(callee : MBuiltinFunction, args) : Model #

Calls an MBuiltinFunction with args.


[View source]
def call(vector : Vec, args) #

Returns the n-th item of vector.


[View source]
def call(string : Str, args) #

Returns the n-th character of string.


[View source]
def call(callee : Model, args) #

[View source]
def compute(operator, left : Model, right : Model) #

Computes a binary operation. Returns false if left and/or right are not of types operator can work with.


[View source]
def constrained(names : Array(String), by types : Quotes) #

Constrains names to types. Evaluates the types, making sure that each returns a type and dying if it does not. Uses MType::ANY for the missing types, if there are any.


[View source]
def die(message : String) #

Dies of runtime error with message. Constructs a traceback where the top entry is the outermost call, and the bottom entry the caller of death itself. Issues a <unit> traceback entry to display the last node in execution, unless it duplicates the last traceback entry.


[View source]
def fetch(name : String) #

Calls Context.fetch with name and dies if not found.


[View source]
def field(head, accessor : SingleFieldAccessor) #

Resolves a SingleFieldAccessor for head. Simply an unpack alias for #field(head, field);


[View source]
def field(head, accessor : DynamicFieldAccessor) #

Resolves a DynamicFieldAccessor for head. The field of the DynamicFieldAccessor must evaluate to Str. Symbols are interpreted differently: if a symbol is defined, its value is used as a field's name; if it isn't it itself is used as a field's name:

box Foo(a, b);

foo = Foo(3, 4);

#) 'a' is not defined at this point:
ensure foo.(a) is 3;

#) Now it is:
ensure { a = "b"; foo.(a) } is 4;

[View source]
def field(head, accessor : MultiFieldAccessor) #

Resolves a MultiFieldAccessor for head. Returns a Vec of the gathered values, or nil if some were not found.


[View source]
def field(head, route : Array(FieldAccessor)) #

Resolves the route for head.


[View source]
def field(head : Model, field : String) : Model | Nil #

Accesses head's field field. Returns nil if there is no such field.


[View source]
def normalize(operator, left : Model, right : Model) : Tuple(Model, Model) #

Converts left and right into the types operator can work with.


[View source]
def typecheck(constraints : ConstrainedParameters, args : Models) : Bool #

Typechecks args against constraints (via of?).


[View source]
def unary(operator, operand : Model) : Model #

Applies unary operator to operand.


[View source]
def visit!(q : QSymbol) #

[View source]
def visit!(q : QNumber) #

[View source]
def visit!(q : QString) #

[View source]
def visit!(q : QRegex) #

[View source]
def visit!(q : QVector) #

[View source]
def visit!(q : QUPop) #

[View source]
def visit!(q : QURef) #

[View source]
def visit!(q : QUnary) #

[View source]
def visit!(q : QBinary) #

[View source]
def visit!(q : QIntoBool) #

[View source]
def visit!(q : QReturnDecrement) #

[View source]
def visit!(q : QReturnIncrement) #

[View source]
def visit!(q : QQuote) #

[View source]
def visit!(q : QAccessField) #

[View source]
def visit!(q : QBinarySpread) #

[View source]
def visit!(q : QLambdaSpread) #

[View source]
def visit!(q : QIf) #

[View source]
def visit!(q : QBlock) #

[View source]
def visit!(q : QAssign) #

[View source]
def visit!(q : QBinaryAssign) #

[View source]
def visit!(q : QFun) #

[View source]
def visit!(q : QEnsure) #

[View source]
def visit!(q : QCall) #

[View source]
def visit!(q : QInfiniteLoop) #

[View source]
def visit!(q : QBaseLoop) #

[View source]
def visit!(q : QStepLoop) #

[View source]
def visit!(q : QComplexLoop) #

[View source]
def visit!(q : QModelCarrier) #

[View source]
def visit!(q : QExpose) #

[View source]
def visit!(q : QDistinct) #

[View source]
def visit!(q : QNext) #

[View source]
def visit!(q : QReturnStatement) #

[View source]
def visit!(q : QReturnExpression) #

[View source]
def visit!(q : QBox) #

[View source]
def world : Ven::World #

[View source]
def world=(world : World) #

[View source]