// Path: src/main/java/org/hummingbirdlang/runtime/bindings/Bindings.java
// public final class Bindings {
//   private Map<String, Binding> bindings;
// 
//   public Bindings() {
//     this.bindings = new HashMap<>();
//   }
// 
//   public Bindings(BuiltinScope builtinScope) throws NameNotFoundException {
//     this();
//     // Bootstrap builtins into frame.
//     for (String name : builtinScope) {
//       Type type = builtinScope.get(name);
//       if (type instanceof FunctionType) {
//         Object function = new Function((FunctionType)type, null);
//         this.bindings.put(name, new BuiltinBinding(name, function));
//       } else {
//         System.out.println("Skipping bootstrap of builtin " + name + ": " + type.toString());
//       }
//     }
//   }
// 
//   public boolean contains(String name) {
//     return this.bindings.containsKey(name);
//   }
// 
//   public Binding get(String name) {
//     return this.bindings.get(name);
//   }
// 
//   public Object getValue(String name) {
//     Binding binding = this.get(name);
//     return binding.get();
//   }
// 
//   public void add(String name, Binding binding) {
//     this.bindings.put(name, binding);
//   }
// 
//   public static final BindingsIdentifier IDENTIFIER = new BindingsIdentifier();
// 
//   private static final class BindingsIdentifier {
//     private BindingsIdentifier() {
//     }
//   }
// }
// 
// Path: src/main/java/org/hummingbirdlang/types/FunctionType.java
// public final class FunctionType extends ConcreteType {
//   private final Type[] parameterTypes;
//   private final Type returnType;
//   private final String name;
//   private final CallTarget callTarget;
//   // Scope where the function was declared.
//   private Scope declarationScope;
//   // Scope inside the function (ie. of its block).
//   private Scope ownScope;
// 
//   public FunctionType(
//     Type[] parameterTypes,
//     Type returnType,
//     String name,
//     CallTarget callTarget
//   ) {
//     this.parameterTypes = parameterTypes;
//     this.returnType = returnType;
//     this.name = name;
//     this.callTarget = callTarget;
//   }
// 
//   public Type[] getParameterTypes() {
//     return this.parameterTypes;
//   }
// 
//   public Type getReturnType() {
//     return this.returnType;
//   }
// 
//   public String getName() {
//     return this.name;
//   }
// 
//   public CallTarget getCallTarget() {
//     return this.callTarget;
//   }
// 
//   public Scope getOwnScope() {
//     if (this.ownScope != null && !this.ownScope.isClosed()) {
//       throw new RuntimeException("Scope not yet closed");
//     }
//     return this.ownScope;
//   }
// 
//   public void setOwnScope(Scope scope) {
//     if (this.ownScope != null) {
//       throw new RuntimeException("Cannot re-set scope");
//     }
//     this.ownScope = scope;
//   }
// 
//   public Scope getDeclarationScope() {
//     if (this.declarationScope != null && !this.declarationScope.isClosed()) {
//       throw new RuntimeException("Scope not yet closed");
//     }
//     return this.declarationScope;
//   }
// 
//   public void setDeclarationScope(Scope declarationScope) {
//     if (this.declarationScope != null) {
//       throw new RuntimeException("Cannot re-set scope");
//     }
//     this.declarationScope = declarationScope;
//   }
// 
//   @Override
//   public Property getProperty(String name) throws PropertyNotFoundException {
//     throw new PropertyNotFoundException("Not yet implemented");
//   }
// }


import com.oracle.truffle.api.CallTarget;
import org.hummingbirdlang.runtime.bindings.Bindings;
import org.hummingbirdlang.types.FunctionType;
package org.hummingbirdlang.objects;



public final class Function {
  private final FunctionType type;
  private final Bindings bindings;
  private final CallTarget callTarget;
  private final String name;

  public Function(FunctionType type, Bindings bindings) {
// Path: src/main/java/org/hummingbirdlang/runtime/bindings/Bindings.java
// public final class Bindings {
//   private Map<String, Binding> bindings;
// 
//   public Bindings() {
//     this.bindings = new HashMap<>();
//   }
// 
//   public Bindings(BuiltinScope builtinScope) throws NameNotFoundException {
//     this();
//     // Bootstrap builtins into frame.
//     for (String name : builtinScope) {
//       Type type = builtinScope.get(name);
//       if (type instanceof FunctionType) {
//         Object function = new Function((FunctionType)type, null);
//         this.bindings.put(name, new BuiltinBinding(name, function));
//       } else {
//         System.out.println("Skipping bootstrap of builtin " + name + ": " + type.toString());
//       }
//     }
//   }
// 
//   public boolean contains(String name) {
//     return this.bindings.containsKey(name);
//   }
// 
//   public Binding get(String name) {
//     return this.bindings.get(name);
//   }
// 
//   public Object getValue(String name) {
//     Binding binding = this.get(name);
//     return binding.get();
//   }
// 
//   public void add(String name, Binding binding) {
//     this.bindings.put(name, binding);
//   }
// 
//   public static final BindingsIdentifier IDENTIFIER = new BindingsIdentifier();
// 
//   private static final class BindingsIdentifier {
//     private BindingsIdentifier() {
//     }
//   }
// }
// 
// Path: src/main/java/org/hummingbirdlang/types/FunctionType.java
// public final class FunctionType extends ConcreteType {
//   private final Type[] parameterTypes;
//   private final Type returnType;
//   private final String name;
//   private final CallTarget callTarget;
//   // Scope where the function was declared.
//   private Scope declarationScope;
//   // Scope inside the function (ie. of its block).
//   private Scope ownScope;
// 
//   public FunctionType(
//     Type[] parameterTypes,
//     Type returnType,
//     String name,
//     CallTarget callTarget
//   ) {
//     this.parameterTypes = parameterTypes;
//     this.returnType = returnType;
//     this.name = name;
//     this.callTarget = callTarget;
//   }
// 
//   public Type[] getParameterTypes() {
//     return this.parameterTypes;
//   }
// 
//   public Type getReturnType() {
//     return this.returnType;
//   }
// 
//   public String getName() {
//     return this.name;
//   }
// 
//   public CallTarget getCallTarget() {
//     return this.callTarget;
//   }
// 
//   public Scope getOwnScope() {
//     if (this.ownScope != null && !this.ownScope.isClosed()) {
//       throw new RuntimeException("Scope not yet closed");
//     }
//     return this.ownScope;
//   }
// 
//   public void setOwnScope(Scope scope) {
//     if (this.ownScope != null) {
//       throw new RuntimeException("Cannot re-set scope");
//     }
//     this.ownScope = scope;
//   }
// 
//   public Scope getDeclarationScope() {
//     if (this.declarationScope != null && !this.declarationScope.isClosed()) {
//       throw new RuntimeException("Scope not yet closed");
//     }
//     return this.declarationScope;
//   }
// 
//   public void setDeclarationScope(Scope declarationScope) {
//     if (this.declarationScope != null) {
//       throw new RuntimeException("Cannot re-set scope");
//     }
//     this.declarationScope = declarationScope;
//   }
// 
//   @Override
//   public Property getProperty(String name) throws PropertyNotFoundException {
//     throw new PropertyNotFoundException("Not yet implemented");
//   }
// }


// Path: src/main/java/org/hummingbirdlang/objects/Function.java
import com.oracle.truffle.api.CallTarget;
import org.hummingbirdlang.runtime.bindings.Bindings;
import org.hummingbirdlang.types.FunctionType;

package org.hummingbirdlang.objects;



public final class Function {
  private final FunctionType type;
  private final Bindings bindings;
  private final CallTarget callTarget;
  private final String name;

  public Function(FunctionType type, Bindings bindings) {
    this.type = type;