Premiär! Fyndchans i SweClockers Månadens Drop

Att skapa ett exekverings träd

Permalänk
Avstängd

Att skapa ett exekverings träd

Hej,
Jag har ett hyfsat komplext problem som jag inte riktigt vet hur man ska hantera. Jag håller på med ett Open Source-projekt. Vi använder Python som skriptspråk via IronPython (.NET tolk för Python).

Användaren av programmet kan skripta input och output från vårt program via skript. Tex

mouse.deltaX = filters.delta(joystick[0].x)

Koden ovan tar det absoluta värdet från en jojje eller gamepad och räknar ut deltavärdet via util-metoden filters.delta sedan sätter jag det relativa värdet på musen via mouse.deltaX

Det är filters.delta som är problemet

För att filters.delta ska fungera måste den spara undan föregående värde, detta sker genom att man skickar med en nyckel som argument

[NeedIndexer] public double delta(double x, string indexer) { var lastSample = x; if (deltaLastSamples.ContainsKey(indexer)) lastSample = deltaLastSamples[indexer]; deltaLastSamples[indexer] = x; return x - lastSample; }

Som ni ser i python-skriptet ovan så behöver man inte skicka med nyckeln, detta beror på att jag preparsar skriptet innan körning och skapar en nyckel baserat på input till metoden. Så skriptet ovan kommer se ut såhär

mouse.deltaX = filters.delta(joystick[0].x, "joystick[0].x")

I detta fall fungerar min lösning därför att joystick[0].x är en unik nyckel, men låt oss säga att användaren skapar en metod

def foo(x): return filters.delta(x) mouse.deltaX = foo(joystick[0].x)

Detta kommer att betyder oberoende av vad vi skickar in till foo så kommer nyckeln "x" användas.

Jag måste på nått snyggt sätt skapa ett exekveringsträd och få med hela kedjan som nyckel "foo(joystick[0].x)>filters.delta(x)"

Någon som har erfarenhet av detta? Måste erkänna att jag glömt det mesta man lärde sig om kompilatorer på KTH

edit: Koden som den ser ut idag
https://github.com/AndersMalmgren/FreePIE/blob/master/FreePIE...

Visa signatur
Permalänk
Medlem

Jag skulle vilja ha delta-funktionen i joystick-objektets klass (kanske finns en bas-klass om som även mouse-objektet ärver från som man kan lägga det i). Så har den internt variabler på senaste positionen. Under huven kan den sedan använda filters.delta().

Skickades från m.sweclockers.com

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Avstängd

Det finns flera tusen FreePIE skript där ute som är beroende av denna syntax, samt det finns ett skäl till att den är som den är, vi ersätter ett icke öppet system som heter GlovePIE där vi försöker efterlika deras syntax. Vår främsta grupp är ickeprogrammera

Sedan hur ska man koppla ihop joystick[0].x med filters utan att skriva behöva explicit skriva koden för varje property

Visa signatur
Permalänk
Datavetare

Finns sätt att få ut byte-koden, detta via modulen dis.

Man kan få ut namnet på funktioner/metoder i anropsstacken, detta via modulen inspect, kolla "The interpreter stack" delen.

Ser däremot inte hur detta skulle lösa problemet då det inte är helt lätt att lura ut exakt var argumentet blir tillräckligt unikt. Vet man att man bara använder en instans av joystick[0].x i koden så skulle man bara kunna slå ihop namnen på funktionerna i anropsstacken och använda som nyckel, men används samma instans från olika ställen skulle man ge olika nycklar till samma instans.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

Går det ändra datatyp på x i joystick-klassen till en egen klass? Klassen ska isf bete sig precis som en double, men man har nu möjlighet att utvärdera datatypen på x i filters.delta(). Om x då är av den nya klasstypen så används det objektets hashkod (eller ex. intern hashkod till joystick-instansen) som indexer, annars den som skickats in som parameter.

Känns dock väldigt fel i mina ögon..

Skickades från m.sweclockers.com

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Avstängd

@vv, hmm, det blir väl ingen skillnad eller? Jag måste veta hur den anropas på root nivå alltså med joystick[0].x att enbart använda namnen på metod-kedjan blir lika lite unikt som den kod jag har (Eller missar jag något). Har även hittat denna modul som verkar intressant. https://docs.python.org/2/library/ast.html

@RiJo
Att boxa en värdetyp bara för att kunna indexera på referensen känns fel

Visa signatur
Permalänk
Avstängd

Jag har kommit en bit med ast

http://pastebin.com/6eH0PiZn

Jag har lyckats dumpa hela koden till en ast string via ast.dump. Måste nu lista ut hur man kan travesera över trädet istället för att dumpa det till en sträng. Dokumenationen är inte den bästa. Lyckas jag med detta kan jag traversera trädet tills jag hittar en NeedIndexerer metod, sedan travesera bakåt och lägga till ett argument i hela kjedjan uppåt till jag nåt body och sedan låta ast modulen generera ett nytt skript.

Visa signatur