| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Результат арифметического выражения: "2*2" в 4. Как?
			 
			
			В старом, добром Fox'е это решалось очень просто: val = &str 
		
		
		
		
		
		
		
	А как это можно сделать в Axapta? Спасибо.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			поищите по runBuf
		 
		
		
		
		
		
		
			
		
		
		
		
	 | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Banned 
		
			
	 | 
	
	
	
		
		
		
		 
			
			evalbuf('2*2')
		 
		
		
		
		
		
		
		
	 | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: e@gle (1), CDan (1). | |
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Вот пример из Tabax: 
		
		
		
		
		
		
			
		
		
		
		
	X++: //src = 'AnyType mainFun(Object tabax){return '+_s+";}" void runIt(str _src, boolean _doWrite=true) { XPPCompiler comp=new XPPCompiler(); ; if(comp.compile(_src)) if (_doWrite) this.write(runBuf(_src, element)); else runBuf(_src, element); else info(comp.errorText()); }  
		 | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Выяснилось, что при выполнении функции evalBuf с некорректным выражением в качестве аргумента (например, с нечисловыми символами), молча прерывается выполнение текущего класса (формирование отчета, например). 
		
		
		
		
		
		
		
	Приведенный ниже пример работает и для некорректных выражений, и для случаев деления на 0: X++: real getResult(str _function) { XPPCompiler comp=new XPPCompiler(); real ret; _function = 'real result(){return ' + _function + ';}'; if(comp.compile(_function)) { try ret = runBuf(_function); catch (Exception::Error) infolog.clear(); } return ret; }  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Banned 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Да. Только не забывайте про trustworthy computing и возможность code injection. В 4.0 рекомендуется вызывать ExecutePermission.assert(): 
		
		
		
		
		
		
		
	X++: try { permission = new ExecutePermission(); if (permission == null) return ...; pseudoFunc = "static real func() { return " + expression + "; }"; permission.assert(); if(comp.compile(pseudoFunc)) { result = runBuf(expression); } else { ... } CodeAccessPermission::revertAssert(); } catch (Exception::Error) { ... }  | 
| 
	
 |