about summary refs log tree commit diff stats
path: root/subx/subx.vim
Commit message (Expand)AuthorAgeFilesLines
* 4984Kartik Agaram2019-02-221-1/+1
* 4885Kartik Agaram2018-12-281-1/+1
* 4880Kartik Agaram2018-12-281-1/+1
* 4876Kartik Agaram2018-12-271-1/+1
* 4871Kartik Agaram2018-12-171-6/+20
* 4870Kartik Agaram2018-12-171-1/+1
* 4867Kartik Agaram2018-12-151-8/+8
* 4843Kartik Agaram2018-12-051-4/+4
* 4816Kartik Agaram2018-12-021-0/+11
* 4811Kartik Agaram2018-11-301-2/+3
* 4807Kartik Agaram2018-11-301-1/+2
* 4805Kartik Agaram2018-11-301-3/+4
* 4798Kartik Agaram2018-11-301-28/+6
* 4796Kartik Agaram2018-11-301-3/+31
* 4772Kartik Agaram2018-11-241-1/+2
* 4757Kartik Agaram2018-11-201-0/+3
* 4667Kartik Agaram2018-10-051-0/+2
* 4523 - Give up on pass-through phasesKartik Agaram2018-08-201-17/+0
* 4512 - divide labels into two categoriesKartik Agaram2018-08-121-0/+7
* 4511Kartik Agaram2018-08-121-0/+2
* 4505 - start warning on jumps without labelsKartik Agaram2018-08-111-0/+10
* 4479Kartik Agaram2018-08-041-0/+1
* 4476Kartik Agaram2018-08-041-0/+2
* 4299Kartik Agaram2018-06-301-0/+1
* 4295Kartik Agaram2018-06-301-1/+1
* 4292 - start a Vim syntax file for our 'language'Kartik Agaram2018-06-301-0/+22
23:44:46 -0800 committer Kartik K. Agaram <vc@akkartik.com> 2015-11-04 23:44:46 -0800 2360' href='/akkartik/mu/commit/046closure_name.cc?h=main&id=436b2b2eac33b893f7b9b0a7229ac1d98c034d2c'>436b2b2e ^
2199940a ^
82ac0b7e ^
363be37f ^
82ac0b7e ^
436b2b2e ^
b2e4056d ^
82ac0b7e ^

363be37f ^
795f5244 ^
57d01f21 ^
795f5244 ^

82ac0b7e ^
ac0e9db5 ^
ab6ed192 ^
0487a30e ^
c6034af3 ^

795f5244 ^
c6034af3 ^
455fbac6 ^
c6034af3 ^
455fbac6 ^




82ac0b7e ^

ae256ea1 ^

795f5244 ^
35064671 ^

ae256ea1 ^

3e5f4358 ^



f3760b0f ^
795f5244 ^
c157066c ^
82ac0b7e ^

795f5244 ^
57d01f21 ^




795f5244 ^
82ac0b7e ^



82ac0b7e ^


363be37f ^

82ac0b7e ^
5f98a10c ^
82ac0b7e ^

ae256ea1 ^


82ac0b7e ^
363be37f ^


82ac0b7e ^




363be37f ^
82ac0b7e ^
f3760b0f ^
5f98a10c ^
ac0e9db5 ^
5f98a10c ^
82ac0b7e ^
5f98a10c ^
82ac0b7e ^








363be37f ^
82ac0b7e ^
f3760b0f ^
795f5244 ^
82ac0b7e ^





5f98a10c ^
ac0e9db5 ^

82ac0b7e ^
ae256ea1 ^

5f98a10c ^
e4630643 ^

ae256ea1 ^
82ac0b7e ^
f3760b0f ^
82ac0b7e ^
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151



                                                                            
 
                   
             



                                                                                     

 
                    
                                                                      

                                                         
                                                   


                          

                                                                                                                            

                                                          
                        

 
                                                                                      


                                                                     
                                     
 
                       
                                                      
 
                                                
                                                               

       
                                                         
                                                                                                           
                                                                                          

                                                                  
                                
                                                             
                                                    
                                                    

                                                 
                                                        
                         
                                                              
                                




                                                                                                                                                   

                 

                                                              
                                                                                                      

                 

                                                                                                                                               



                                                                                                                  
                                            
                                                                                    
                                                                                                                                                                                                               

                 
                                                                                                                                                    




                                                                                                                                                 
                                                                          



     


                                                                              

                                                                                               
                                  
                                                                                                   

                                        


                                                                                                                       
                 


                                                                                   




                                                                            
                                                                                                                              
                                               
                              
                                                                                        
                                                    
                                                                                                    
     
                                                                                                                








                                                                                                
                                                                                   
                       
                                            
                                                                                               





                                                              
                                              

                                                                                                  
                                 

                                          
                                                                                                                                      

                   
                                     
   
                                     
 
//: Writing to a literal (not computed) address of 0 in a recipe chains two
//: spaces together. When a variable has a property of /space:1, it looks up
//: the variable in the chained/surrounding space. /space:2 looks up the
//: surrounding space of the surrounding space, etc.

:(scenario closure)
recipe main [
  default-space:address:shared:array:location <- new location:type, 30
  1:address:shared:array:location/names:new-counter <- new-counter
  2:number/raw <- increment-counter 1:address:shared:array:location/names:new-counter
  3:number/raw <- increment-counter 1:address:shared:array:location/names:new-counter
]

recipe new-counter [
  default-space:address:shared:array:location <- new location:type, 30
  x:number <- copy 23
  y:number <- copy 3  # variable that will be incremented
  reply default-space:address:shared:array:location
]

recipe increment-counter [
  default-space:address:shared:array:location <- new location:type, 30
  0:address:shared:array:location/names:new-counter <- next-ingredient  # outer space must be created by 'new-counter' above
  y:number/space:1 <- add y:number/space:1, 1  # increment
  y:number <- copy 234  # dummy
  reply y:number/space:1
]

+name: lexically surrounding space for recipe increment-counter comes from new-counter
+mem: storing 5 in location 3

//: To make this work, compute the recipe that provides names for the
//: surrounding space of each recipe.

:(before "End Globals")
map<recipe_ordinal, recipe_ordinal> Surrounding_space;

:(before "Transform.push_back(transform_names)")
Transform.push_back(collect_surrounding_spaces);  // idempotent

:(code)
void collect_surrounding_spaces(const recipe_ordinal r) {
  trace(9991, "transform") << "--- collect surrounding spaces for recipe " << get(Recipe, r).name << end();
//?   cerr << "--- collect surrounding spaces for recipe " << get(Recipe, r).name << '\n';
  for (long long int i = 0; i < SIZE(get(Recipe, r).steps); ++i) {
    const instruction& inst = get(Recipe, r).steps.at(i);
    if (inst.is_label) continue;
    for (long long int j = 0; j < SIZE(inst.products); ++j) {
      if (is_literal(inst.products.at(j))) continue;
      if (inst.products.at(j).name != "0") continue;
      type_tree* type = inst.products.at(j).type;
      if (!type
          || type->value != get(Type_ordinal, "address")
          || !type->right
          || type->right->value != get(Type_ordinal, "shared")
          || !type->right->right
          || type->right->right->value != get(Type_ordinal, "array")
          || !type->right->right->right
          || type->right->right->right->value != get(Type_ordinal, "location")
          || type->right->right->right->right) {
        raise_error << "slot 0 should always have type address:shared:array:location, but is " << inst.products.at(j).to_string() << '\n' << end();
        continue;
      }
      string_tree* s = property(inst.products.at(j), "names");
      if (!s) {
        raise_error << "slot 0 requires a /names property in recipe " << get(Recipe, r).name << end();
        continue;
      }
      if (s->right) raise_error << "slot 0 should have a single value in /names, but got " << inst.products.at(j).to_string() << '\n' << end();
      const string& surrounding_recipe_name = s->value;
      if (surrounding_recipe_name.empty()) {
        raise_error << "slot 0 doesn't initialize its /names property in recipe " << get(Recipe, r).name << end();
        continue;
      }
      if (contains_key(Surrounding_space, r)
          && Surrounding_space[r] != get(Recipe_ordinal, surrounding_recipe_name)) {
        raise_error << "recipe " << get(Recipe, r).name << " can have only one 'surrounding' recipe but has " << get(Recipe, Surrounding_space[r]).name << " and " << surrounding_recipe_name << '\n' << end();
        continue;
      }
      trace(9993, "name") << "lexically surrounding space for recipe " << get(Recipe, r).name << " comes from " << surrounding_recipe_name << end();
//?       cerr << "lexically surrounding space for recipe " << get(Recipe, r).name << " comes from " << surrounding_recipe_name << '\n';
      if (!contains_key(Recipe_ordinal, surrounding_recipe_name)) {
        raise << "can't find recipe providing surrounding space for " << get(Recipe, r).name << ": " << surrounding_recipe_name << '\n' << end();
        continue;
      }
      Surrounding_space[r] = get(Recipe_ordinal, surrounding_recipe_name);
    }
  }
}

//: Once surrounding spaces are available, transform_names uses them to handle
//: /space properties.

:(replace{} "long long int lookup_name(const reagent& r, const recipe_ordinal default_recipe)")
long long int lookup_name(const reagent& x, const recipe_ordinal default_recipe) {
  if (!has_property(x, "space")) {
    if (Name[default_recipe].empty()) raise_error << "name not found: " << x.name << '\n' << end();
    return Name[default_recipe][x.name];
  }
  string_tree* p = property(x, "space");
  if (!p || p->right) raise_error << "/space property should have exactly one (non-negative integer) value\n" << end();
  long long int n = to_integer(p->value);
  assert(n >= 0);
  recipe_ordinal surrounding_recipe = lookup_surrounding_recipe(default_recipe, n);
  set<recipe_ordinal> done;
  vector<recipe_ordinal> path;
  return lookup_name(x, surrounding_recipe, done, path);
}

// If the recipe we need to lookup this name in doesn't have names done yet,
// recursively call transform_names on it.
long long int lookup_name(const reagent& x, const recipe_ordinal r, set<recipe_ordinal>& done, vector<recipe_ordinal>& path) {
  if (!Name[r].empty()) return Name[r][x.name];
  if (contains_key(done, r)) {
    raise_error << "can't compute address of " << x.to_string() << " because " << end();
    for (long long int i = 1; i < SIZE(path); ++i) {
      raise_error << path.at(i-1) << " requires computing names of " << path.at(i) << '\n' << end();
    }
    raise_error << path.at(SIZE(path)-1) << " requires computing names of " << r << "..ad infinitum\n" << end();
    return 0;
  }
  done.insert(r);
  path.push_back(r);
  transform_names(r);  // Not passing 'done' through. Might this somehow cause an infinite loop?
  assert(!Name[r].empty());
  return Name[r][x.name];
}

recipe_ordinal lookup_surrounding_recipe(const recipe_ordinal r, long long int n) {
  if (n == 0) return r;
  if (!contains_key(Surrounding_space, r)) {
    raise_error << "don't know surrounding recipe of " << get(Recipe, r).name << '\n' << end();
    return 0;
  }
  assert(Surrounding_space[r]);
  return lookup_surrounding_recipe(Surrounding_space[r], n-1);
}

//: weaken use-before-set detection just a tad
:(replace{} "bool already_transformed(const reagent& r, const map<string, long long int>& names)")
bool already_transformed(const reagent& r, const map<string, long long int>& names) {
  if (has_property(r, "space")) {
    string_tree* p = property(r, "space");
    if (!p || p->right) {
      raise_error << "/space property should have exactly one (non-negative integer) value in " << r.original_string << '\n' << end();
      return false;
    }
    if (p->value != "0") return true;
  }
  return contains_key(names, r.name);
}