goodguide-gibbon 0.9.1 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0b9274f014ac2966c20ab9a9e93e1535754ca705
4
- data.tar.gz: f8c5435731719c0b5bf2eb70a1af9dfa048226e3
3
+ metadata.gz: ade669c4d8c8e8cf9dc4f03f5e383e9f0341d8d9
4
+ data.tar.gz: c385c96569b2f9301590e6052a1076c44f0f4e2f
5
5
  SHA512:
6
- metadata.gz: 839d16f12f2f2caec2c85279ebcd986c0588933fe16bdf436cf52e80fc29110dff46e48d6dca6e01f0d2503d33ec801abce550db2176b24a621122111910a7a5
7
- data.tar.gz: d7ed1feab0b50fa8dd969348c86b2ceba57bd8e500de6b4256848e9b018e5cabbeb35f66233ad16462b55815a19582df4666616184112b4f0017338032d8daa3
6
+ metadata.gz: dd0d2352b67e3ea169bee3951c0856893c5fd4383593939f047adf196803ccd6171dd52abc3e1d488d2f805cf3987d7772eb314a6226eaf9a0b393dff33cd8fa
7
+ data.tar.gz: e447692892c3cc072396c2d09cdab4159697f1797639c7f0a84a065528404f33a582a483f12502b93310d63b1f985236efa40f5ddbd8ae6b4b4cc035ff1e9467
@@ -1,7 +1,7 @@
1
1
  module GoodGuide
2
2
  module Gibbon
3
3
  def self.version
4
- '0.9.1'
4
+ '0.9.2'
5
5
  end
6
6
  end
7
7
  end
@@ -16,6 +16,8 @@ end
16
16
 
17
17
  require 'pathname'
18
18
 
19
+ load Pathname.new(__FILE__).dirname.join('gibbon/version.rb')
20
+
19
21
  module GoodGuide
20
22
  module Gibbon
21
23
  module Util
@@ -936,10 +936,11 @@ Gibbon.ObjHash = ObjHash = (function(_super) {
936
936
  };
937
937
 
938
938
  ObjHash.prototype.set = function(k, v) {
939
- return this[k.hash()] = {
939
+ this[k.hash()] = {
940
940
  key: k,
941
941
  value: v
942
942
  };
943
+ return v;
943
944
  };
944
945
 
945
946
  ObjHash.prototype.has = function(k) {
@@ -2612,7 +2613,14 @@ Gibbon.Core = Core = (function(_super) {
2612
2613
 
2613
2614
  Core.prototype.depair = function(key) {
2614
2615
  if (key) {
2615
- return Core.depair(this, key);
2616
+ return this.cases({
2617
+ pair: function() {
2618
+ return this[key];
2619
+ },
2620
+ other: function() {
2621
+ return Core.depair(this, key);
2622
+ }
2623
+ });
2616
2624
  } else {
2617
2625
  return [this.depair('first'), this.depair('second')];
2618
2626
  }
@@ -2639,7 +2647,14 @@ Gibbon.Core = Core = (function(_super) {
2639
2647
  };
2640
2648
 
2641
2649
  Core.prototype.len = function() {
2642
- return Core.len(this);
2650
+ return this.cases({
2651
+ list: function(els) {
2652
+ return Core.constant(els.length);
2653
+ },
2654
+ other: function() {
2655
+ return Core.len(this);
2656
+ }
2657
+ });
2643
2658
  };
2644
2659
 
2645
2660
  Core.prototype.rescue = function(alt) {
@@ -2802,6 +2817,7 @@ Gibbon.Core = Core = (function(_super) {
2802
2817
  },
2803
2818
  delist: single,
2804
2819
  depair: single,
2820
+ squishList: single,
2805
2821
  list: function(e) {
2806
2822
  return e;
2807
2823
  },
@@ -3257,11 +3273,22 @@ Gibbon.translate = (function() {
3257
3273
  })();
3258
3274
 
3259
3275
  Gibbon.optimize = (function() {
3260
- var insertBindings, partialEval;
3276
+ var insertBindings, partialEval, uncachedPartialEval;
3261
3277
  partialEval = function(expr) {
3278
+ var cache, recurse, result;
3279
+ cache = new ObjHash;
3280
+ result = (recurse = function(expr) {
3281
+ return cache.cache(expr, function() {
3282
+ return uncachedPartialEval(expr, recurse);
3283
+ });
3284
+ })(expr);
3285
+ DEBUG.log("evaled to: " + (result.inspect()));
3286
+ return result;
3287
+ };
3288
+ uncachedPartialEval = function(expr, recurse) {
3262
3289
  return expr.cases({
3263
3290
  depair: function(expr, key) {
3264
- return partialEval(expr).cases({
3291
+ return recurse(expr).cases({
3265
3292
  pair: function() {
3266
3293
  DEBUG.log("inlining lookup " + key + " of " + (this.inspect()));
3267
3294
  return this[key];
@@ -3272,7 +3299,7 @@ Gibbon.optimize = (function() {
3272
3299
  });
3273
3300
  },
3274
3301
  delist: function(expr, index) {
3275
- return partialEval(expr).cases({
3302
+ return recurse(expr).cases({
3276
3303
  list: function(els) {
3277
3304
  DEBUG.log("inlining lookup " + index + " of " + (this.inspect()));
3278
3305
  return els[index];
@@ -3284,10 +3311,10 @@ Gibbon.optimize = (function() {
3284
3311
  },
3285
3312
  branch: function(cond, ifTrue, ifFalse) {
3286
3313
  var abort;
3287
- cond = partialEval(cond);
3314
+ cond = recurse(cond);
3288
3315
  abort = function() {
3289
- ifTrue = partialEval(ifTrue);
3290
- ifFalse = partialEval(ifFalse);
3316
+ ifTrue = recurse(ifTrue);
3317
+ ifFalse = recurse(ifFalse);
3291
3318
  if (ifTrue.equals(ifFalse)) {
3292
3319
  DEBUG.log("eliminating condition in equivalent branches: " + (this.inspect()));
3293
3320
  return ifTrue;
@@ -3298,20 +3325,21 @@ Gibbon.optimize = (function() {
3298
3325
  constant: function(value) {
3299
3326
  if (value) {
3300
3327
  DEBUG.log("eliminating dead false branch " + (ifFalse.inspect()));
3301
- return partialEval(ifTrue);
3328
+ return recurse(ifTrue);
3302
3329
  } else {
3303
3330
  DEBUG.log("eliminating dead true branch " + (ifTrue.inspect()));
3304
- return partialEval(ifFalse);
3331
+ return recurse(ifFalse);
3305
3332
  }
3306
3333
  },
3307
3334
  branch: function(innerCond, innerTrue, innerFalse) {
3335
+ debugger;
3308
3336
  DEBUG.log("flattening nested branch " + (this.inspect()));
3309
- return partialEval(innerCond.branch(innerTrue.branch(ifTrue, ifFalse), innerFalse.branch(ifTrue, ifFalse)));
3337
+ return recurse(innerCond.branch(innerTrue.branch(ifTrue, ifFalse), innerFalse.branch(ifTrue, ifFalse)));
3310
3338
  },
3311
3339
  op1: function(name, arg) {
3312
3340
  if (name === '!') {
3313
3341
  DEBUG.log("eliminating if negation in condition " + (this.inspect()));
3314
- return partialEval(arg.branch(ifFalse, ifTrue));
3342
+ return recurse(arg.branch(ifFalse, ifTrue));
3315
3343
  } else {
3316
3344
  return abort();
3317
3345
  }
@@ -3320,57 +3348,53 @@ Gibbon.optimize = (function() {
3320
3348
  });
3321
3349
  },
3322
3350
  app: function(block, arg) {
3323
- return partialEval(block).cases({
3351
+ return recurse(block).cases({
3324
3352
  block: function(argName, body) {
3325
3353
  DEBUG.log("inlining application of " + (this.inspect()) + " to " + (arg.inspect()));
3326
- return partialEval(body.subst(argName, arg));
3354
+ return recurse(body.subst(argName, arg));
3327
3355
  },
3328
3356
  other: function() {
3329
- return this.app(partialEval(arg));
3357
+ return this.app(recurse(arg));
3330
3358
  }
3331
3359
  });
3332
3360
  },
3333
3361
  mapList: function(list, arg, ixName, body) {
3334
- return list.cases({
3362
+ return recurse(list).cases({
3335
3363
  list: function(elements) {
3336
- var el, i, mapped, _i, _len;
3364
+ var el, i, mapped;
3337
3365
  DEBUG.log("inlining MAP");
3338
- for (i = _i = 0, _len = elements.length; _i < _len; i = ++_i) {
3339
- el = elements[i];
3340
- DEBUG.log(("subst " + arg + "=" + (el.inspect()) + " ") + ("" + ixName + "=" + i + " " + (body.inspect())));
3341
- partialEval(body.subst(arg, el).subst(ixName, Core.constant(i)));
3342
- }
3343
3366
  mapped = (function() {
3344
- var _j, _len1, _results;
3367
+ var _i, _len, _results;
3345
3368
  _results = [];
3346
- for (_j = 0, _len1 = elements.length; _j < _len1; _j++) {
3347
- el = elements[_j];
3348
- _results.push(body.subst(arg, el));
3369
+ for (i = _i = 0, _len = elements.length; _i < _len; i = ++_i) {
3370
+ el = elements[i];
3371
+ DEBUG.log(("subst " + arg + "=" + (el.inspect()) + " ") + ("" + ixName + "=" + i + " " + (body.inspect())));
3372
+ _results.push(recurse(body.subst(arg, el).subst(ixName, Core.constant(i))));
3349
3373
  }
3350
3374
  return _results;
3351
3375
  })();
3352
- return partialEval(Core.list(mapped));
3376
+ return recurse(Core.list(mapped));
3353
3377
  },
3354
3378
  mapList: function(innerList, innerArg, innerIdxArg, innerBody) {
3355
3379
  var newBody;
3356
3380
  DEBUG.log("fusing MAP of " + (this.inspect()));
3357
3381
  newBody = body.subst(arg, innerBody).subst(ixName, Core.variable(innerIdxArg));
3358
- return Core.mapList(innerList, innerArg, innerIdxArg, newBody);
3382
+ return recurse(Core.mapList(innerList, innerArg, innerIdxArg, newBody));
3359
3383
  },
3360
3384
  other: function() {
3361
- return Core.mapList(partialEval(this), arg, ixName, partialEval(body));
3385
+ return Core.mapList(recurse(this), arg, ixName, recurse(body));
3362
3386
  }
3363
3387
  });
3364
3388
  },
3365
3389
  foldList: function(list, out, arg, accum, ixName, body) {
3366
- return partialEval(list).cases({
3390
+ return recurse(list).cases({
3367
3391
  list: function(elements) {
3368
3392
  var _loop;
3369
3393
  DEBUG.log("inlining FOLDR");
3370
- return partialEval((_loop = function(i) {
3394
+ return recurse((_loop = function(i) {
3371
3395
  var next;
3372
3396
  if (i >= elements.length) {
3373
- return partialEval(out);
3397
+ return recurse(out);
3374
3398
  }
3375
3399
  next = _loop(i + 1);
3376
3400
  DEBUG.log(("subst " + arg + "=" + (elements[i].inspect()) + " ") + ("" + accum + "=" + (next.inspect()) + " ") + ("" + ixName + "=i " + (body.inspect())));
@@ -3384,23 +3408,23 @@ Gibbon.optimize = (function() {
3384
3408
  return Core.foldList(innerList, out, innerArg, accum, innerIdxArg, newBody);
3385
3409
  },
3386
3410
  other: function() {
3387
- return Core.foldList(this, partialEval(out), arg, accum, ixName, partialEval(body));
3411
+ return Core.foldList(this, recurse(out), arg, accum, ixName, recurse(body));
3388
3412
  }
3389
3413
  });
3390
3414
  },
3391
3415
  len: function(list) {
3392
- return partialEval(list).cases({
3416
+ return recurse(list).cases({
3393
3417
  list: function(elements) {
3394
3418
  DEBUG.log("optimizing out len from " + (this.inspect()));
3395
3419
  return Core.constant(elements.length);
3396
3420
  },
3397
3421
  mapList: function(list) {
3398
3422
  DEBUG.log("optimizing MAP out of len");
3399
- return partialEval(list.len());
3423
+ return recurse(list.len());
3400
3424
  },
3401
3425
  zipLists: function(l, r) {
3402
3426
  DEBUG.log("optimizing ZIP out of len");
3403
- return partialEval(l.len());
3427
+ return recurse(l.len());
3404
3428
  },
3405
3429
  other: function() {
3406
3430
  return this.len();
@@ -3409,8 +3433,8 @@ Gibbon.optimize = (function() {
3409
3433
  },
3410
3434
  zipLists: function(l, r) {
3411
3435
  var e, elements, i;
3412
- l = partialEval(l);
3413
- r = partialEval(r);
3436
+ l = recurse(l);
3437
+ r = recurse(r);
3414
3438
  if (!(l._tag === 'list' && r._tag === 'list')) {
3415
3439
  return Core.zipLists(l, r);
3416
3440
  }
@@ -3423,10 +3447,10 @@ Gibbon.optimize = (function() {
3423
3447
  }
3424
3448
  return _results;
3425
3449
  })();
3426
- return partialEval(Core.list(elements));
3450
+ return recurse(Core.list(elements));
3427
3451
  },
3428
3452
  op1: function(op, arg) {
3429
- return partialEval(arg).cases({
3453
+ return recurse(arg).cases({
3430
3454
  constant: function(value) {
3431
3455
  return Core.constant(applyOp1(op, value));
3432
3456
  },
@@ -3437,8 +3461,8 @@ Gibbon.optimize = (function() {
3437
3461
  },
3438
3462
  op2: function(op, left, right) {
3439
3463
  var checkConst, checkIdent, identFold, l, r, _ref10;
3440
- left = partialEval(left);
3441
- right = partialEval(right);
3464
+ left = recurse(left);
3465
+ right = recurse(right);
3442
3466
  checkConst = function(val, f) {
3443
3467
  return val._tag === 'constant' && f(val.value);
3444
3468
  };
@@ -3474,19 +3498,19 @@ Gibbon.optimize = (function() {
3474
3498
  return Core.constant(applyOp2(op, left.value, right.value));
3475
3499
  },
3476
3500
  rescue: function(expr, default_) {
3477
- expr = partialEval(expr);
3501
+ expr = recurse(expr);
3478
3502
  if (expr.alwaysSucceeds()) {
3479
3503
  DEBUG.log("eliminating dead default branch of " + (this.inspect()));
3480
3504
  return expr;
3481
3505
  } else if (expr.alwaysFails()) {
3482
3506
  DEBUG.log("eliminating dead main branch of " + (this.inspect()));
3483
- return partialEval(default_);
3507
+ return recurse(default_);
3484
3508
  } else {
3485
- return Core.rescue(expr, partialEval(default_));
3509
+ return Core.rescue(expr, recurse(default_));
3486
3510
  }
3487
3511
  },
3488
3512
  other: function() {
3489
- return this.map(partialEval);
3513
+ return this.map(recurse);
3490
3514
  }
3491
3515
  });
3492
3516
  };
@@ -3498,7 +3522,7 @@ Gibbon.optimize = (function() {
3498
3522
  }).reverse();
3499
3523
  };
3500
3524
  genSubstitutions = function(expr) {
3501
- var newTrace, occurrences, queue, sub, substitutions, trace, _i, _len, _ref10, _ref11;
3525
+ var newTrace, occurrences, queue, sub, substitutions, trace, _i, _len, _ref10, _ref11, _ref12;
3502
3526
  occurrences = new ObjHash;
3503
3527
  substitutions = new Hash;
3504
3528
  queue = [[expr, List.empty()]];
@@ -3512,9 +3536,12 @@ Gibbon.optimize = (function() {
3512
3536
  } else {
3513
3537
  occurrences.set(expr, [makeCrumbs(trace)]);
3514
3538
  newTrace = trace.cons(expr);
3515
- _ref11 = expr.subtrees();
3516
- for (_i = 0, _len = _ref11.length; _i < _len; _i++) {
3517
- sub = _ref11[_i];
3539
+ if ((_ref11 = expr._tag) === 'rescue' || _ref11 === 'squishList') {
3540
+ continue;
3541
+ }
3542
+ _ref12 = expr.subtrees();
3543
+ for (_i = 0, _len = _ref12.length; _i < _len; _i++) {
3544
+ sub = _ref12[_i];
3518
3545
  queue.push([sub, newTrace]);
3519
3546
  }
3520
3547
  }
@@ -3583,7 +3610,20 @@ Gibbon.optimize = (function() {
3583
3610
  return Core.variable(names[i]);
3584
3611
  }
3585
3612
  }
3586
- return boundExpr.map(recurseInner);
3613
+ return boundExpr.cases({
3614
+ rescue: function(expr, default_) {
3615
+ return Core.rescue(insertBindings(expr), insertBindings(default_));
3616
+ },
3617
+ squishList: function(list) {
3618
+ if (list._tag !== 'list') {
3619
+ throw 'invalid squish';
3620
+ }
3621
+ return Core.squishList(list.map(insertBindings));
3622
+ },
3623
+ other: function() {
3624
+ return this.map(recurseInner);
3625
+ }
3626
+ });
3587
3627
  })(expr);
3588
3628
  for (i = _i = 0, _len = bindableExprs.length; _i < _len; i = ++_i) {
3589
3629
  bindable = bindableExprs[i];
@@ -5571,6 +5611,20 @@ stdlib = Gibbon.stdlib = (function() {
5571
5611
  });
5572
5612
  }
5573
5613
  },
5614
+ "bucket": {
5615
+ type: parse.type('bucket [numeric : %b] = numeric -> %b'),
5616
+ compile: function(input, _arg) {
5617
+ var default_, partitions;
5618
+ partitions = _arg[0];
5619
+ default_ = Core.fail('bucket: exceeded the last bucket');
5620
+ return partitions.foldList(default_, function(pair, next) {
5621
+ var boundary, result;
5622
+ boundary = pair.depair('first');
5623
+ result = pair.depair('second');
5624
+ return input.op2('<=', boundary).branch(result, next);
5625
+ });
5626
+ }
5627
+ },
5574
5628
  "any-true?": {
5575
5629
  type: parse.type('any-true? = [bool] -> bool'),
5576
5630
  compile: function(list) {
@@ -926,10 +926,11 @@ Gibbon.ObjHash = ObjHash = (function(_super) {
926
926
  };
927
927
 
928
928
  ObjHash.prototype.set = function(k, v) {
929
- return this[k.hash()] = {
929
+ this[k.hash()] = {
930
930
  key: k,
931
931
  value: v
932
932
  };
933
+ return v;
933
934
  };
934
935
 
935
936
  ObjHash.prototype.has = function(k) {
@@ -2580,7 +2581,14 @@ Gibbon.Core = Core = (function(_super) {
2580
2581
 
2581
2582
  Core.prototype.depair = function(key) {
2582
2583
  if (key) {
2583
- return Core.depair(this, key);
2584
+ return this.cases({
2585
+ pair: function() {
2586
+ return this[key];
2587
+ },
2588
+ other: function() {
2589
+ return Core.depair(this, key);
2590
+ }
2591
+ });
2584
2592
  } else {
2585
2593
  return [this.depair('first'), this.depair('second')];
2586
2594
  }
@@ -2607,7 +2615,14 @@ Gibbon.Core = Core = (function(_super) {
2607
2615
  };
2608
2616
 
2609
2617
  Core.prototype.len = function() {
2610
- return Core.len(this);
2618
+ return this.cases({
2619
+ list: function(els) {
2620
+ return Core.constant(els.length);
2621
+ },
2622
+ other: function() {
2623
+ return Core.len(this);
2624
+ }
2625
+ });
2611
2626
  };
2612
2627
 
2613
2628
  Core.prototype.rescue = function(alt) {
@@ -2770,6 +2785,7 @@ Gibbon.Core = Core = (function(_super) {
2770
2785
  },
2771
2786
  delist: single,
2772
2787
  depair: single,
2788
+ squishList: single,
2773
2789
  list: function(e) {
2774
2790
  return e;
2775
2791
  },
@@ -3225,11 +3241,22 @@ Gibbon.translate = (function() {
3225
3241
  })();
3226
3242
 
3227
3243
  Gibbon.optimize = (function() {
3228
- var insertBindings, partialEval;
3244
+ var insertBindings, partialEval, uncachedPartialEval;
3229
3245
  partialEval = function(expr) {
3246
+ var cache, recurse, result;
3247
+ cache = new ObjHash;
3248
+ result = (recurse = function(expr) {
3249
+ return cache.cache(expr, function() {
3250
+ return uncachedPartialEval(expr, recurse);
3251
+ });
3252
+ })(expr);
3253
+
3254
+ return result;
3255
+ };
3256
+ uncachedPartialEval = function(expr, recurse) {
3230
3257
  return expr.cases({
3231
3258
  depair: function(expr, key) {
3232
- return partialEval(expr).cases({
3259
+ return recurse(expr).cases({
3233
3260
  pair: function() {
3234
3261
 
3235
3262
  return this[key];
@@ -3240,7 +3267,7 @@ Gibbon.optimize = (function() {
3240
3267
  });
3241
3268
  },
3242
3269
  delist: function(expr, index) {
3243
- return partialEval(expr).cases({
3270
+ return recurse(expr).cases({
3244
3271
  list: function(els) {
3245
3272
 
3246
3273
  return els[index];
@@ -3252,10 +3279,10 @@ Gibbon.optimize = (function() {
3252
3279
  },
3253
3280
  branch: function(cond, ifTrue, ifFalse) {
3254
3281
  var abort;
3255
- cond = partialEval(cond);
3282
+ cond = recurse(cond);
3256
3283
  abort = function() {
3257
- ifTrue = partialEval(ifTrue);
3258
- ifFalse = partialEval(ifFalse);
3284
+ ifTrue = recurse(ifTrue);
3285
+ ifFalse = recurse(ifFalse);
3259
3286
  if (ifTrue.equals(ifFalse)) {
3260
3287
 
3261
3288
  return ifTrue;
@@ -3266,20 +3293,21 @@ Gibbon.optimize = (function() {
3266
3293
  constant: function(value) {
3267
3294
  if (value) {
3268
3295
 
3269
- return partialEval(ifTrue);
3296
+ return recurse(ifTrue);
3270
3297
  } else {
3271
3298
 
3272
- return partialEval(ifFalse);
3299
+ return recurse(ifFalse);
3273
3300
  }
3274
3301
  },
3275
3302
  branch: function(innerCond, innerTrue, innerFalse) {
3303
+ debugger;
3276
3304
 
3277
- return partialEval(innerCond.branch(innerTrue.branch(ifTrue, ifFalse), innerFalse.branch(ifTrue, ifFalse)));
3305
+ return recurse(innerCond.branch(innerTrue.branch(ifTrue, ifFalse), innerFalse.branch(ifTrue, ifFalse)));
3278
3306
  },
3279
3307
  op1: function(name, arg) {
3280
3308
  if (name === '!') {
3281
3309
 
3282
- return partialEval(arg.branch(ifFalse, ifTrue));
3310
+ return recurse(arg.branch(ifFalse, ifTrue));
3283
3311
  } else {
3284
3312
  return abort();
3285
3313
  }
@@ -3288,57 +3316,53 @@ Gibbon.optimize = (function() {
3288
3316
  });
3289
3317
  },
3290
3318
  app: function(block, arg) {
3291
- return partialEval(block).cases({
3319
+ return recurse(block).cases({
3292
3320
  block: function(argName, body) {
3293
3321
 
3294
- return partialEval(body.subst(argName, arg));
3322
+ return recurse(body.subst(argName, arg));
3295
3323
  },
3296
3324
  other: function() {
3297
- return this.app(partialEval(arg));
3325
+ return this.app(recurse(arg));
3298
3326
  }
3299
3327
  });
3300
3328
  },
3301
3329
  mapList: function(list, arg, ixName, body) {
3302
- return list.cases({
3330
+ return recurse(list).cases({
3303
3331
  list: function(elements) {
3304
- var el, i, mapped, _i, _len;
3332
+ var el, i, mapped;
3305
3333
 
3306
- for (i = _i = 0, _len = elements.length; _i < _len; i = ++_i) {
3307
- el = elements[i];
3308
-
3309
- partialEval(body.subst(arg, el).subst(ixName, Core.constant(i)));
3310
- }
3311
3334
  mapped = (function() {
3312
- var _j, _len1, _results;
3335
+ var _i, _len, _results;
3313
3336
  _results = [];
3314
- for (_j = 0, _len1 = elements.length; _j < _len1; _j++) {
3315
- el = elements[_j];
3316
- _results.push(body.subst(arg, el));
3337
+ for (i = _i = 0, _len = elements.length; _i < _len; i = ++_i) {
3338
+ el = elements[i];
3339
+
3340
+ _results.push(recurse(body.subst(arg, el).subst(ixName, Core.constant(i))));
3317
3341
  }
3318
3342
  return _results;
3319
3343
  })();
3320
- return partialEval(Core.list(mapped));
3344
+ return recurse(Core.list(mapped));
3321
3345
  },
3322
3346
  mapList: function(innerList, innerArg, innerIdxArg, innerBody) {
3323
3347
  var newBody;
3324
3348
 
3325
3349
  newBody = body.subst(arg, innerBody).subst(ixName, Core.variable(innerIdxArg));
3326
- return Core.mapList(innerList, innerArg, innerIdxArg, newBody);
3350
+ return recurse(Core.mapList(innerList, innerArg, innerIdxArg, newBody));
3327
3351
  },
3328
3352
  other: function() {
3329
- return Core.mapList(partialEval(this), arg, ixName, partialEval(body));
3353
+ return Core.mapList(recurse(this), arg, ixName, recurse(body));
3330
3354
  }
3331
3355
  });
3332
3356
  },
3333
3357
  foldList: function(list, out, arg, accum, ixName, body) {
3334
- return partialEval(list).cases({
3358
+ return recurse(list).cases({
3335
3359
  list: function(elements) {
3336
3360
  var _loop;
3337
3361
 
3338
- return partialEval((_loop = function(i) {
3362
+ return recurse((_loop = function(i) {
3339
3363
  var next;
3340
3364
  if (i >= elements.length) {
3341
- return partialEval(out);
3365
+ return recurse(out);
3342
3366
  }
3343
3367
  next = _loop(i + 1);
3344
3368
 
@@ -3352,23 +3376,23 @@ Gibbon.optimize = (function() {
3352
3376
  return Core.foldList(innerList, out, innerArg, accum, innerIdxArg, newBody);
3353
3377
  },
3354
3378
  other: function() {
3355
- return Core.foldList(this, partialEval(out), arg, accum, ixName, partialEval(body));
3379
+ return Core.foldList(this, recurse(out), arg, accum, ixName, recurse(body));
3356
3380
  }
3357
3381
  });
3358
3382
  },
3359
3383
  len: function(list) {
3360
- return partialEval(list).cases({
3384
+ return recurse(list).cases({
3361
3385
  list: function(elements) {
3362
3386
 
3363
3387
  return Core.constant(elements.length);
3364
3388
  },
3365
3389
  mapList: function(list) {
3366
3390
 
3367
- return partialEval(list.len());
3391
+ return recurse(list.len());
3368
3392
  },
3369
3393
  zipLists: function(l, r) {
3370
3394
 
3371
- return partialEval(l.len());
3395
+ return recurse(l.len());
3372
3396
  },
3373
3397
  other: function() {
3374
3398
  return this.len();
@@ -3377,8 +3401,8 @@ Gibbon.optimize = (function() {
3377
3401
  },
3378
3402
  zipLists: function(l, r) {
3379
3403
  var e, elements, i;
3380
- l = partialEval(l);
3381
- r = partialEval(r);
3404
+ l = recurse(l);
3405
+ r = recurse(r);
3382
3406
  if (!(l._tag === 'list' && r._tag === 'list')) {
3383
3407
  return Core.zipLists(l, r);
3384
3408
  }
@@ -3391,10 +3415,10 @@ Gibbon.optimize = (function() {
3391
3415
  }
3392
3416
  return _results;
3393
3417
  })();
3394
- return partialEval(Core.list(elements));
3418
+ return recurse(Core.list(elements));
3395
3419
  },
3396
3420
  op1: function(op, arg) {
3397
- return partialEval(arg).cases({
3421
+ return recurse(arg).cases({
3398
3422
  constant: function(value) {
3399
3423
  return Core.constant(applyOp1(op, value));
3400
3424
  },
@@ -3405,8 +3429,8 @@ Gibbon.optimize = (function() {
3405
3429
  },
3406
3430
  op2: function(op, left, right) {
3407
3431
  var checkConst, checkIdent, identFold, l, r, _ref10;
3408
- left = partialEval(left);
3409
- right = partialEval(right);
3432
+ left = recurse(left);
3433
+ right = recurse(right);
3410
3434
  checkConst = function(val, f) {
3411
3435
  return val._tag === 'constant' && f(val.value);
3412
3436
  };
@@ -3442,19 +3466,19 @@ Gibbon.optimize = (function() {
3442
3466
  return Core.constant(applyOp2(op, left.value, right.value));
3443
3467
  },
3444
3468
  rescue: function(expr, default_) {
3445
- expr = partialEval(expr);
3469
+ expr = recurse(expr);
3446
3470
  if (expr.alwaysSucceeds()) {
3447
3471
 
3448
3472
  return expr;
3449
3473
  } else if (expr.alwaysFails()) {
3450
3474
 
3451
- return partialEval(default_);
3475
+ return recurse(default_);
3452
3476
  } else {
3453
- return Core.rescue(expr, partialEval(default_));
3477
+ return Core.rescue(expr, recurse(default_));
3454
3478
  }
3455
3479
  },
3456
3480
  other: function() {
3457
- return this.map(partialEval);
3481
+ return this.map(recurse);
3458
3482
  }
3459
3483
  });
3460
3484
  };
@@ -3466,7 +3490,7 @@ Gibbon.optimize = (function() {
3466
3490
  }).reverse();
3467
3491
  };
3468
3492
  genSubstitutions = function(expr) {
3469
- var newTrace, occurrences, queue, sub, substitutions, trace, _i, _len, _ref10, _ref11;
3493
+ var newTrace, occurrences, queue, sub, substitutions, trace, _i, _len, _ref10, _ref11, _ref12;
3470
3494
  occurrences = new ObjHash;
3471
3495
  substitutions = new Hash;
3472
3496
  queue = [[expr, List.empty()]];
@@ -3480,9 +3504,12 @@ Gibbon.optimize = (function() {
3480
3504
  } else {
3481
3505
  occurrences.set(expr, [makeCrumbs(trace)]);
3482
3506
  newTrace = trace.cons(expr);
3483
- _ref11 = expr.subtrees();
3484
- for (_i = 0, _len = _ref11.length; _i < _len; _i++) {
3485
- sub = _ref11[_i];
3507
+ if ((_ref11 = expr._tag) === 'rescue' || _ref11 === 'squishList') {
3508
+ continue;
3509
+ }
3510
+ _ref12 = expr.subtrees();
3511
+ for (_i = 0, _len = _ref12.length; _i < _len; _i++) {
3512
+ sub = _ref12[_i];
3486
3513
  queue.push([sub, newTrace]);
3487
3514
  }
3488
3515
  }
@@ -3543,7 +3570,20 @@ Gibbon.optimize = (function() {
3543
3570
  return Core.variable(names[i]);
3544
3571
  }
3545
3572
  }
3546
- return boundExpr.map(recurseInner);
3573
+ return boundExpr.cases({
3574
+ rescue: function(expr, default_) {
3575
+ return Core.rescue(insertBindings(expr), insertBindings(default_));
3576
+ },
3577
+ squishList: function(list) {
3578
+ if (list._tag !== 'list') {
3579
+ throw 'invalid squish';
3580
+ }
3581
+ return Core.squishList(list.map(insertBindings));
3582
+ },
3583
+ other: function() {
3584
+ return this.map(recurseInner);
3585
+ }
3586
+ });
3547
3587
  })(expr);
3548
3588
  for (i = _i = 0, _len = bindableExprs.length; _i < _len; i = ++_i) {
3549
3589
  bindable = bindableExprs[i];
@@ -5531,6 +5571,20 @@ stdlib = Gibbon.stdlib = (function() {
5531
5571
  });
5532
5572
  }
5533
5573
  },
5574
+ "bucket": {
5575
+ type: parse.type('bucket [numeric : %b] = numeric -> %b'),
5576
+ compile: function(input, _arg) {
5577
+ var default_, partitions;
5578
+ partitions = _arg[0];
5579
+ default_ = Core.fail('bucket: exceeded the last bucket');
5580
+ return partitions.foldList(default_, function(pair, next) {
5581
+ var boundary, result;
5582
+ boundary = pair.depair('first');
5583
+ result = pair.depair('second');
5584
+ return input.op2('<=', boundary).branch(result, next);
5585
+ });
5586
+ }
5587
+ },
5534
5588
  "any-true?": {
5535
5589
  type: parse.type('any-true? = [bool] -> bool'),
5536
5590
  compile: function(list) {
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: goodguide-gibbon
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jay Adkisson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-12 00:00:00.000000000 Z
11
+ date: 2014-03-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Run and analyze gibbon code from ruby or a browser (via a ruby app).
14
14
  email: