goodguide-gibbon 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  module GoodGuide
2
2
  module Gibbon
3
3
  def self.version
4
- '0.1.0'
4
+ '0.2.0'
5
5
  end
6
6
  end
7
7
  end
@@ -858,8 +858,7 @@ Gibbon.AST = AST = (function(_super) {
858
858
  flow: ['head', 'tail'],
859
859
  metadata: ['key', 'text'],
860
860
  definition: ['metadata', 'name', 'frame'],
861
- frame: ['definitions', 'flow'],
862
- program: ['definitions']
861
+ frame: ['definitions', 'flow']
863
862
  });
864
863
 
865
864
  inspectDefinitions = function(defs) {
@@ -956,9 +955,6 @@ Gibbon.AST = AST = (function(_super) {
956
955
  out.push(flow.inspect());
957
956
  out.push(")");
958
957
  return out.join('');
959
- },
960
- program: function(definitions) {
961
- return inspectDefinitions(definitions);
962
958
  }
963
959
  });
964
960
  };
@@ -992,7 +988,7 @@ Gibbon.TypeAST = TypeAST = (function(_super) {
992
988
  })(Union);
993
989
 
994
990
  parse = Gibbon.parse = (function() {
995
- var accessor, accessorExpr, arrow, arrowType, assertString, bang, blockExpr, blockType, comma, comment, component, concrete, decimal, decimalExpr, define, definition, expr, fail, flow, fraction, fractionExpr, frame, freeFrame, fullSignature, func, funcPlaceholder, identifier, ignore, integer, integerExpr, isString, label, labelVal, lbrace, lbrack, lexeme, listExpr, listType, lparen, metadata, name, nativeId, nativeType, nonPairedFlow, numericExpr, pair, parenFlow, parenFrame, parenType, percent, percentExpr, program, rbrace, rbrack, regex, rparen, signature, simpleType, singletonFlow, str, string, stringExpr, substExpr, succeed, tassign, type, typeVar, variable, whitespace, wildType, wildcard;
991
+ var accessor, accessorExpr, arrow, arrowType, assertString, bang, blockExpr, blockType, comma, comment, component, concrete, decimal, decimalExpr, define, definition, expr, fail, flow, fraction, fractionExpr, frame, freeFrame, fullSignature, func, funcPlaceholder, identifier, ignore, innerFrame, integer, integerExpr, isString, label, labelVal, lbrace, lbrack, lexeme, listExpr, listType, lparen, metadata, name, nativeId, nativeType, nonPairedFlow, numericExpr, pair, parenFlow, parenFrame, parenType, percent, percentExpr, program, rbrace, rbrack, regex, rparen, signature, simpleType, singletonFlow, str, string, stringExpr, substExpr, succeed, tassign, type, typeVar, variable, whitespace, wildType, wildcard;
996
992
  string = Parsimmon.string, regex = Parsimmon.regex, succeed = Parsimmon.succeed, fail = Parsimmon.fail;
997
993
  Parsimmon.Parser.prototype.expected = function(message) {
998
994
  var _this = this;
@@ -1114,23 +1110,22 @@ parse = Gibbon.parse = (function() {
1114
1110
  });
1115
1111
  definition = metadata.many().then(function(md) {
1116
1112
  return name.then(function(n) {
1117
- return define.expected().then(frame.expected()).map(function(fl) {
1113
+ return define.then(innerFrame.expected()).map(function(fl) {
1118
1114
  return AST.definition(md, n, fl);
1119
1115
  });
1120
1116
  });
1121
1117
  });
1122
- parenFrame = lparen.then(definition.many()).then(function(defs) {
1123
- return flow.expected().skip(rparen.expected()).map(function(fl) {
1118
+ frame = definition.many().then(function(defs) {
1119
+ return flow.expected().map(function(fl) {
1124
1120
  return AST.frame(defs, fl);
1125
1121
  });
1126
1122
  });
1123
+ parenFrame = lparen.then(frame).skip(rparen.expected());
1127
1124
  freeFrame = flow.map(function(fl) {
1128
1125
  return AST.frame([], fl);
1129
1126
  });
1130
- frame = parenFrame.or(freeFrame);
1131
- program = ignore.then(definition.many().map(function(defs) {
1132
- return AST.program(defs);
1133
- }));
1127
+ innerFrame = parenFrame.or(freeFrame);
1128
+ program = ignore.then(frame);
1134
1129
  tassign = lexeme(string('='));
1135
1130
  bang = lexeme(string('!'));
1136
1131
  nativeId = lexeme(regex(/^\w+/));
@@ -1763,20 +1758,22 @@ analyze = Gibbon.analyze = (function() {
1763
1758
 
1764
1759
  })();
1765
1760
  Scope = (function() {
1766
- Scope.global = function(context, definitions) {
1767
- return new Scope(null, [], definitions, context);
1761
+ var makeKey;
1762
+
1763
+ Scope.global = function(context, frame) {
1764
+ return new Scope(null, [], frame, context);
1768
1765
  };
1769
1766
 
1770
- function Scope(parent, breadcrumbs, definitions, context) {
1767
+ function Scope(parent, breadcrumbs, frame, context) {
1771
1768
  this.parent = parent;
1772
1769
  this.breadcrumbs = breadcrumbs;
1773
- this.definitions = definitions;
1770
+ this.frame = frame;
1774
1771
  this.context = context;
1775
1772
  this.bindings = new Hash;
1776
1773
  }
1777
1774
 
1778
- Scope.prototype.extend = function(name, definitions) {
1779
- return new Scope(this, this.breadcrumbs.concat([name]), definitions, this.context);
1775
+ Scope.prototype.extend = function(name, frame) {
1776
+ return new Scope(this, this.breadcrumbs.concat([name]), frame, this.context);
1780
1777
  };
1781
1778
 
1782
1779
  Scope.prototype.lookup = function(nativeId, name, cb) {
@@ -1811,31 +1808,33 @@ analyze = Gibbon.analyze = (function() {
1811
1808
  return TypeLookup.local(this.keyFor(name));
1812
1809
  };
1813
1810
 
1811
+ makeKey = function(crumbs) {
1812
+ return '/' + crumbs.join('/');
1813
+ };
1814
+
1815
+ Scope.prototype.key = function() {
1816
+ return makeKey(this.breadcrumbs);
1817
+ };
1818
+
1814
1819
  Scope.prototype.keyFor = function(name) {
1815
- return this.breadcrumbs.concat([name]).join('/');
1820
+ return makeKey(this.breadcrumbs.concat([name]));
1816
1821
  };
1817
1822
 
1818
- Scope.prototype.analyzeDefinitions = function(push) {
1819
- var def, frameScope, global, _i, _len, _ref4, _results,
1820
- _this = this;
1821
- global = TypeExpr["native"](this.context.globalID);
1822
- _ref4 = this.definitions;
1823
- _results = [];
1823
+ Scope.prototype.analyze = function(push) {
1824
+ var def, frame, frameScope, global, key, _i, _len, _ref4;
1825
+ _ref4 = this.frame.definitions;
1824
1826
  for (_i = 0, _len = _ref4.length; _i < _len; _i++) {
1825
1827
  def = _ref4[_i];
1826
- this.bindings.set(def.name, def);
1827
- frameScope = this.extend(def.name, def.frame.definitions);
1828
- frameScope.analyzeDefinitions(push);
1829
- _results.push((function(def) {
1830
- var key, pusher;
1831
- key = _this.keyFor(def.name);
1832
- pusher = function(lhs, rhs) {
1833
- return push(key, def, [lhs, rhs]);
1834
- };
1835
- return frameScope.analyzeFlow(def.frame.flow, global, pusher);
1836
- })(def));
1828
+ frameScope = this.extend(def.name, def.frame);
1829
+ frameScope.analyze(push);
1830
+ this.bindings.set(def.name, frameScope);
1837
1831
  }
1838
- return _results;
1832
+ key = this.key();
1833
+ global = TypeExpr["native"](this.context.globalID);
1834
+ frame = this.frame;
1835
+ return this.analyzeFlow(this.frame.flow, global, function(lhs, rhs) {
1836
+ return push(key, frame, [lhs, rhs]);
1837
+ });
1839
1838
  };
1840
1839
 
1841
1840
  Scope.prototype.analyzeFlow = function(flow, global, push) {
@@ -1919,13 +1918,13 @@ analyze = Gibbon.analyze = (function() {
1919
1918
  return function(globalID, externalLookup, program) {
1920
1919
  var constraintMap, context, scope;
1921
1920
  context = new NativeContext(globalID, externalLookup);
1922
- scope = Scope.global(context, program.definitions);
1921
+ scope = Scope.global(context, program);
1923
1922
  constraintMap = new Hash;
1924
- scope.analyzeDefinitions(function(key, def, constraint) {
1923
+ scope.analyze(function(key, frame, constraint) {
1925
1924
  var entry;
1926
1925
  entry = constraintMap.cache(key, function() {
1927
1926
  return {
1928
- definition: def,
1927
+ frame: frame,
1929
1928
  constraints: []
1930
1929
  };
1931
1930
  });
@@ -1949,7 +1948,7 @@ analyze = Gibbon.analyze = (function() {
1949
1948
  infinite: ['type'],
1950
1949
  destructure: ['type'],
1951
1950
  access: ['type'],
1952
- circular: ['definition']
1951
+ circular: ['crumbs']
1953
1952
  });
1954
1953
 
1955
1954
  return TypeError;
@@ -1974,21 +1973,24 @@ analyze = Gibbon.analyze = (function() {
1974
1973
  return loop_();
1975
1974
  };
1976
1975
  return function(constraintMap, finish) {
1977
- var definitionTypes, errors, semantics, solutions, solveEntry;
1976
+ var errors, frameTypes, initialCrumbs, k, locks, semantics, solutions, solveEntry;
1978
1977
  errors = [];
1979
1978
  solutions = new CompMap(function(x, y) {
1980
1979
  return x.equals(y);
1981
1980
  });
1982
1981
  semantics = new Hash;
1983
- definitionTypes = new Hash;
1984
- solveEntry = function(key, solved) {
1985
- var constraints, definition, dependencies, done, error, fullSubstitute, lhs, rhs, semanticAccessors, simplify, substitute, _i, _len, _ref5, _ref6;
1982
+ frameTypes = new Hash;
1983
+ locks = new Hash;
1984
+ solveEntry = function(crumbs, solved) {
1985
+ var constraints, dependencies, done, error, frame, fullSubstitute, key, lhs, nextCrumbs, rhs, semanticAccessors, simplify, substitute, _i, _len, _ref5, _ref6;
1986
+ key = crumbs[crumbs.length - 1];
1986
1987
  if (semantics.has(key)) {
1987
1988
  return solved();
1988
1989
  }
1989
- _ref5 = constraintMap.get(key), definition = _ref5.definition, constraints = _ref5.constraints;
1990
- console.log('locking', definition.inspect());
1991
- definition.lock = true;
1990
+ nextCrumbs = crumbs.concat([key]);
1991
+ _ref5 = constraintMap.get(key), frame = _ref5.frame, constraints = _ref5.constraints;
1992
+ console.log('locking', key);
1993
+ locks.set(key, true);
1992
1994
  semanticAccessors = new CompMap;
1993
1995
  dependencies = [];
1994
1996
  for (_i = 0, _len = constraints.length; _i < _len; _i++) {
@@ -2049,16 +2051,16 @@ analyze = Gibbon.analyze = (function() {
2049
2051
  return cb(TypeExpr.fromAST(Gibbon.parse.unitType(response.type)));
2050
2052
  },
2051
2053
  local: function(key) {
2052
- var localDef;
2054
+ var localFrame;
2055
+ nextCrumbs = crumbs.concat([key]);
2053
2056
  semanticAccessors.set(accessor, Semantic.localAccessor(key));
2054
- localDef = constraintMap.get(key).definition;
2055
- if ('lock' in localDef) {
2056
- return cb(error('circular', localDef));
2057
- } else {
2058
- return solveEntry(key, function() {
2059
- return cb(definitionTypes.get(key));
2060
- });
2057
+ if (locks.get(key)) {
2058
+ return cb(error('circular', nextCrumbs));
2061
2059
  }
2060
+ localFrame = constraintMap.get(key).frame;
2061
+ return solveEntry(nextCrumbs, function() {
2062
+ return cb(frameTypes.get(key));
2063
+ });
2062
2064
  }
2063
2065
  });
2064
2066
  });
@@ -2078,15 +2080,14 @@ analyze = Gibbon.analyze = (function() {
2078
2080
  var flowType, toSemanticTree;
2079
2081
  flowType = function(expr) {
2080
2082
  if (!solutions.has(TypeExpr.expr(expr))) {
2081
- solutions.get(TypeExpr.expr(expr));
2082
2083
  throw 'unsolved!';
2083
2084
  }
2084
2085
  return solutions.get(TypeExpr.expr(expr)).realize();
2085
2086
  };
2086
2087
  toSemanticTree = function(expr) {
2087
2088
  return expr.cases({
2088
- definition: function(name, metadata, frame) {
2089
- return Semantic.definition(dependencies, toSemanticTree(frame.flow));
2089
+ frame: function(_, flow) {
2090
+ return Semantic.definition(dependencies, toSemanticTree(flow));
2090
2091
  },
2091
2092
  flow: function(head, tail) {
2092
2093
  return Semantic.flow(flowType(this), toSemanticTree(head), tail && toSemanticTree(tail));
@@ -2148,10 +2149,10 @@ analyze = Gibbon.analyze = (function() {
2148
2149
  return logConstraint('=> ', k, v);
2149
2150
  });
2150
2151
  console.log('setting key: ' + key);
2151
- semantics.set(key, toSemanticTree(definition));
2152
- definitionTypes.set(key, solutions.get(TypeExpr.expr(definition.frame.flow)));
2153
- console.log('unlocking', definition);
2154
- delete definition.lock;
2152
+ semantics.set(key, toSemanticTree(frame));
2153
+ frameTypes.set(key, solutions.get(TypeExpr.expr(frame.flow)));
2154
+ console.log('unlocking', key);
2155
+ locks.set(key, false);
2155
2156
  return solved();
2156
2157
  };
2157
2158
  return consume(constraints.reverse(), done, function(lhs, rhs, push, next) {
@@ -2252,7 +2253,18 @@ analyze = Gibbon.analyze = (function() {
2252
2253
  });
2253
2254
  });
2254
2255
  };
2255
- return contMap(constraintMap.keys(), solveEntry, function() {
2256
+ initialCrumbs = (function() {
2257
+ var _i, _len, _ref5, _results;
2258
+ _ref5 = constraintMap.keys();
2259
+ _results = [];
2260
+ for (_i = 0, _len = _ref5.length; _i < _len; _i++) {
2261
+ k = _ref5[_i];
2262
+ _results.push([k]);
2263
+ }
2264
+ return _results;
2265
+ })();
2266
+ console.log('initial crumbs', initialCrumbs);
2267
+ return contMap(initialCrumbs, solveEntry, function() {
2256
2268
  if (errors.length === 0) {
2257
2269
  errors = null;
2258
2270
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: goodguide-gibbon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-07-03 00:00:00.000000000 Z
12
+ date: 2013-07-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  type: :runtime