       direction: "in"
   return pinDefs
 
-# Returns an object mapping pin expression names to their values 
+# Returns an object mapping pin expression names to their functions 
 # Pin expressions is an object that contains 'in' and 'out' attributes
-GE.evaluateInputPinExpressions = (path, evaluationContext, pinDefs, pinExpressions) ->
-  evaluatedPins = {}
-
-  # TODO: don't evaluate output pinexpressions here!
+GE.compileInputPinExpressions = (path, evaluationContext, pinDefs, pinExpressions) ->
+  compiledPins = {}
+
+  # TODO: don't compile output pin expressions here!
   for pinName, pinOptions of pinDefs
     # Resolve pin expression value. If the board doesn't specify a value, use the default, it it exists. Otherwise, throw exception for input values
     if pinOptions.direction in ["in", "inout"] and pinExpressions.in?[pinName] 

      else
        @bindings[bindingName] = bindingValue

  compileExpression: (expression) -> GE.compileExpression(expression, @constants.evaluator)

  # Pins are optional
  evaluateFunction: (f, pins) -> f(@memory, @io, @constants.assets, @constants.transformers, @bindings, pins)

  # Pins are optional
  evaluateExpression: (expression, pins) -> @evaluateFunction(@compileExpression(expression), pins)

GE.extensions =
  IMAGE: ["png", "gif", "jpeg", "jpg"]

  result = new GE.ChipVisitorResult(GE.signals.DONE)
  GE.transformersLogger = GE.makeLogFunction(path, result.logMessages)

  for dest, expressionFunction of chip.emitter  
    evaluationContext = new GE.EvaluationContext(constants, bindings)

    try
      outputValue = evaluationContext.evaluateExpressionFunction(expressionFunction)
    catch error
      throw GE.makeExecutionError("Error executing the output pin expression '#{expressionFunction}' --> '#{dest}' for emitter chip: #{error.stack}", path)

    [parent, key] = GE.getParentAndKey(evaluationContext, dest.split("."))
    parent[key] = outputValue
