* Change the semantics of "with" so that inner "withs" take
precedence, i.e. `with {x=1;}; with {x=2;}; x' evaluates to 2'.
  This has a simpler implementation and seems more natural.  There
  doesn't seem to be any code in Nixpkgs or NixOS that relies on the
  old behaviour.
			
			
This commit is contained in:
		
							parent
							
								
									816f9c0f6f
								
							
						
					
					
						commit
						85d13c8f93
					
				
					 2 changed files with 2 additions and 25 deletions
				
			
		|  | @ -232,19 +232,6 @@ void mkPath(Value & v, const char * s) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| Value * EvalState::lookupWith(Env * env, const Symbol & name) |  | ||||||
| { |  | ||||||
|     if (!env) return 0; |  | ||||||
|     Value * v = lookupWith(env->up, name); |  | ||||||
|     if (v) return v; |  | ||||||
|     Bindings::iterator i = env->bindings.find(sWith); |  | ||||||
|     if (i == env->bindings.end()) return 0; |  | ||||||
|     Bindings::iterator j = i->second.attrs->find(name); |  | ||||||
|     if (j != i->second.attrs->end()) return &j->second; |  | ||||||
|     return 0; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| Value * EvalState::lookupVar(Env * env, const Symbol & name) | Value * EvalState::lookupVar(Env * env, const Symbol & name) | ||||||
| { | { | ||||||
|     /* First look for a regular variable binding for `name'. */ |     /* First look for a regular variable binding for `name'. */ | ||||||
|  | @ -254,22 +241,14 @@ Value * EvalState::lookupVar(Env * env, const Symbol & name) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /* Otherwise, look for a `with' attribute set containing `name'.
 |     /* Otherwise, look for a `with' attribute set containing `name'.
 | ||||||
|        Outer `withs' take precedence (i.e. `with {x=1;}; with {x=2;}; |        Inner `withs' take precedence (i.e. `with {x=1;}; with {x=2;}; | ||||||
|        x' evaluates to 1).  */ |        x' evaluates to 2). */ | ||||||
|     Value * v = lookupWith(env, name); |  | ||||||
|     if (v) return v; |  | ||||||
| 
 |  | ||||||
|     /* Alternative implementation where the inner `withs' take
 |  | ||||||
|        precedence (i.e. `with {x=1;}; with {x=2;}; x' evaluates to |  | ||||||
|        2). */ |  | ||||||
| #if 0 |  | ||||||
|     for (Env * env2 = env; env2; env2 = env2->up) { |     for (Env * env2 = env; env2; env2 = env2->up) { | ||||||
|         Bindings::iterator i = env2->bindings.find(sWith); |         Bindings::iterator i = env2->bindings.find(sWith); | ||||||
|         if (i == env2->bindings.end()) continue; |         if (i == env2->bindings.end()) continue; | ||||||
|         Bindings::iterator j = i->second.attrs->find(name); |         Bindings::iterator j = i->second.attrs->find(name); | ||||||
|         if (j != i->second.attrs->end()) return &j->second; |         if (j != i->second.attrs->end()) return &j->second; | ||||||
|     } |     } | ||||||
| #endif |  | ||||||
|      |      | ||||||
|     throwEvalError("undefined variable `%1%'", name); |     throwEvalError("undefined variable `%1%'", name); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -240,8 +240,6 @@ private: | ||||||
| 
 | 
 | ||||||
|     Value * lookupVar(Env * env, const Symbol & name); |     Value * lookupVar(Env * env, const Symbol & name); | ||||||
|      |      | ||||||
|     Value * lookupWith(Env * env, const Symbol & name); |  | ||||||
| 
 |  | ||||||
|     friend class ExprVar; |     friend class ExprVar; | ||||||
|     friend class ExprAttrs; |     friend class ExprAttrs; | ||||||
|     friend class ExprLet; |     friend class ExprLet; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue