Evaluierung dynamischer Ausdrücke für AutoHotFlow

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Evaluierung dynamischer Ausdrücke für AutoHotFlow

Re: Evaluierung dynamischer Ausdrücke für AutoHotFlow

Post by strobo » 23 Feb 2015, 09:54

So weit war ich auch.
Dann kann man aber das
Ersetzen von Variablennamen im Skript durch neue mit einem Präfix, z.B. Instance_5_var_... Dafür müsste man aber sämtliche Variablen erkennen, was schwierig sein dürfte bei der Fülle an ahk Befehlen.
im Falle der expressions durchführen. Wenn du allgemeinen ahk code ausführen willst brauchst du einen Interpreter, und iirc wird der, und da wiederhole ich mich gerne, von ahk_h/ahkdll geliefert.

Re: Evaluierung dynamischer Ausdrücke für AutoHotFlow

Post by bichlepa » 15 Feb 2015, 13:15

So weit war ich auch. Ich schreibe mal einfach ein Beispielcode, der das Problem ohne viele Worte beschreibt:

Code: Select all

	InstanceID=5 ;Instanznummer einer Ausführung eines Flows
	Instance_%InstanceID%_LocalVariables:=Object() ;Erstelle Objekt, in den alle lokalen Variablen für eine Ausführung gespeichert werden
	v_setVariable(InstanceID,"kontostand",5000) ;Setze Variable kontostand
	v_setVariable(InstanceID,"schulden",4000) ;Setze Variable schulden
	MsgBox % "Gesetzte Variablen:`nkonstostand: " v_getVariable(InstanceID,"kontostand") "`nschulden: " v_getVariable(InstanceID,"schulden")
	
	teststring=% "kontostand - schulden"
	
	MsgBox I am starting
	;Evaluiere den Ausdruck. Dabei werden die Variablen "kontostand" und "schulden" über die Funktion  "v_GetVariable(InstanceID,varname)" geholt
	res:=v_EvaluateExpression(InstanceID,teststring) 
	MsgBox % "Result of " teststring " is " res 
Hier kann man den Code herunterladen zum Ausprobieren:
https://www.dropbox.com/s/wxcxtcefewqwy ... es.7z?dl=0

Re: Evaluierung dynamischer Ausdrücke für AutoHotFlow

Post by strobo » 15 Feb 2015, 12:49

Das funzt hier ganz wunderbar

Code: Select all

ExprInit() ;initialize the Compile() and Eval() functions
x := 12
e := ExprCompile("x**2")
y := ExprEval(e)
msgbox,% y
...aber vllt misverstehe ich deine Problemstellung.
Um beliegigen ahk code (also nicht nur expressions) auszuführen vllt mal ahk_h/ahkdll antesten.

Re: Evaluierung dynamischer Ausdrücke für AutoHotFlow

Post by bichlepa » 15 Feb 2015, 11:56

Ich habe jetzt doch eine eigene Funktion geschrieben. Eine sehr hilfreiche Anleitung habe ich unter http://www.sunshine2k.de/coding/java/Si ... arser.html gefunden. Es ist halb so wild, wie ich mir vorgestellt habe.
Es hat bei weitem nicht die Funktionalität von AutoHotkey und hat wahrscheinlich deutliche Performance Einbußen, aber es ist besser als nichts. Es werden folgende Operatoren unterstützt: =, ==, !=, <, >, <=, >=, +, -, *, /, || bzw or, && bzw and, ! bzw not.

Ganz vom Tisch ist das Problem nicht. Es wäre wünschenswert, dass AutoHotFlow alles unterstützt, was AHK auch kann, daher ist jede Hilfe weiterhin willkommen.

Evaluierung dynamischer Ausdrücke für AutoHotFlow

Post by bichlepa » 14 Feb 2015, 07:33

Bei der Arbeit an AutoHotFlow stehe ich vor einer schweren Herausforderung. Ich möchte eine Aktion "Skript" und eine Bedingung "Expression" einführen. Dafür muss ein Code, der zuvor in ein Edit-Feld eingegeben wurde, ausgeführt werden. Eine Erschwernis ist, dass alle Instanzen der Flow Ausführung eigene Variablen besitzen, was eine unabhängige parallele Ausführung verschiedener Instanzen erlaubt. Beim Setzen und Holen von Variablen muss eine der beiden von mir geschriebenen Funktionen aufgerufen werden:
  • v_setVariable(InstanceID,name,value,VariableType="Normal")
  • v_getVariable(InstanceID,name,VariableType="Normal")
Ich habe schon verschiedene Möglichkeiten probiert:
  • ExprEval von Uberi. Im Allgemeinen funktioniert es super, nur das Holen und Setzen von Variablen mithilfe der erwähnten Funktionen ist nicht möglich. Vielleicht könnten man die Funktion umschreiben, aber der Code ist zu kompliziert für mich.
    Oder man könnte vielleicht in einer neuen Funktion alle Variablen einer Instanz als lokale Variablen schreiben und dann den Text evaluieren (was aber erfordert, dass die Evaluierung auf die lokalen variablen zugreifen kann oder innerhalb der Funktion erfolgt)
  • Eval - Dynamic expression evaluation for AutoHotkey_L von Fincs. Dieselbe Geschichte wie bei ExprEval.
  • Generierung eines externen Skripts, in dem vor der Ausführung des eigentlichen Skripts alle Variablen gesetzt werden und am Ende alle Variablen zurückgesendet werden. Dies habe ich bereits umgesetzt, aber die Performanz ist sehr niedrig, da dafür ein neuer AHK Prozess gestartet werden muss.
  • Ersetzen von Variablennamen im Skript durch neue mit einem Präfix, z.B. Instance_5_var_... Dafür müsste man aber sämtliche Variablen erkennen, was schwierig sein dürfte bei der Fülle an ahk Befehlen.
Denkbar wäre auch, eigene Funktion zur Evaluierung zu schreiben, was aber zu kompliziert und zeitraubend wäre.

Habt ihr Ideen, wie das zu machen ist?

Top