Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Προσθήκη συναρτήσεων δυναμικά σε F#

Îåêßíçóå áðü ôï ìÝëïò opterios. Τελευταία δημοσίευση από το μέλος opterios στις 04-10-2013, 16:19. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  03-10-2013, 18:54 74459

    Προσθήκη συναρτήσεων δυναμικά σε F#

    Έχω σε ένα project της F# μία λίστα συναρτήσεων με signature
    -------------------------------------------------
    val myFunctionsList : (MyType -> bool) list
    -------------------------------------------------

    Τη λίστα συναρτήσεων αυτή θα την εφαρμόζω ως φίλτρο σε κάποια τιμή τύπου myType και θέλω να ξέρω αυτή η τιμή ποιες από τις συναρτήσεις της λίστας ικανοποιεί. Δηλαδή θα γίνεται κάτι σαν το εξής:

    myFunctionsList
    |> List.filter (fun f -> f(myValue))

    Σήμερα που αναπτύσσεται το project οι συναρτήσεις αυτές είναι περίπου 30 και είναι υλοποιημένες. Το θέμα μου είναι ότι θέλω να εμπλουτίζεται συνεχώς η λίστα αυτή με νέες συναρτήσεις, των οποίων η υλοποίηση δε θα είναι εκ των προτέρων γνωστή. Υπάρχει κάποιος προτεινόμενος τρόπος να προσθέτω συναρτήσεις χωρίς να χρειάζεται να ανεβάζω κάθε φορά έκδοση; Πχ. θα μπορούσα να χρησιμοποιήσω κάποιο script αρχείο όπου να έχω εκεί υλοποιημένες αυτές τις συναρτήσεις, ώστε κάθε φορά που προκύπτει κάποια νέα, να συμπληρώνω στο script απλώς μία ακόμα συνάρτηση;

    Δεν έχω δουλέψει ποτέ με scripts (σε κανένα περιβάλλον), γι' αυτό ρωτάω μήπως υπάρχει κάποιος common τρόπος χρήσης τους που αγνοώ. Δεν έχω ιδέα πώς να το αντιμετωπίσω, αλλά εφόσον η F# διαχειρίζεται τις συναρτήσεις ως...data, υποθέτω πως είναι σχετικά κοινή ανάγκη κάτι τέτοιο κι ελπίζω πως κάποιο τρόπο θα έχει που αγνοώ ;)


    Θέμης
    twitter: @devopterios
    Δημοσίευση στην κατηγορία:
  •  04-10-2013, 09:12 74463 σε απάντηση της 74459

    Απ: Προσθήκη συναρτήσεων δυναμικά σε F#

    Απαντώ στον εαυτό μου :P

    Σκέφτηκα ότι στην ουσία θέλω δυναμικό compiling, οπότε μάλλον δεν είναι τόσο trivial όσο το σκέφτηκα αρχικά!

    Θα πάω με τον παραδοσιακό τρόπο και αν εν τω μεταξύ έχει κανείς κάποια ιδέα, καλοδεχούμενη :)

    Thx,
    Θ. 


    Θέμης
    twitter: @devopterios
  •  04-10-2013, 10:10 74464 σε απάντηση της 74463

    Απ: Προσθήκη συναρτήσεων δυναμικά σε F#

    Αυτό που περιγράφεις λέγεται parsing, όχι scripting ή δυναμικό compiling. Και ένα από τα δυνατά σημεία της F# είναι το parsing . Τόσο το documentation της F# όσο και όλα τα βιβλία και tutorials για F# καλύπτουν σε κάποιο σημείο και πως μπορείς να φτιάξεις το δικό σου parser. Ουσιαστικά αυτό που θέλεις είναι να φτιάξεις ένα .ΝΕΤ expression tree από το κείμενο ενός function. Μπορεί να γίνει και με το χέρι, αλλά καλύτερα να χρησιμοποιήσεις κάποιο parser generator για να δημιουργήσεις τον κώδικα του parser από το συντακτικό που θέλεις. 

    Η ίδια η F# περιλαμβάνει εργαλεία όπως το fslex και fsyacc για τη δημιουργία parsers.   Εναλλακτικά, μπορείς να χρησιμοποιήσεις μία βιβλιοθήκη για parsing όπως η FParsec η οποία είναι καθαρά F#. Με αυτή θα έχεις μάλλον πιο γρήγορα αποτελέσματα αλλά δεν θα μπορέσεις να καλύψεις όλες μα όλες τις δυνατότητες του ANTLR. Από την άλλη, το parsing ενός και μόνο function δεν απαιτεί κάτι εξωτικό.

    Στα samples του source code θα βρεις και το "κλασσικό" παράδειγμα ενός απλού calculator το οποίο μπορεί να σε βοηθήσει να πάρεις μία ιδέα. 

    Υπάρχουν βέβαια και πιο "βαριές" λύσεις, όπως ο ANTLR, ένας από τους πιο διάσημους parser generators. Είναι ανεξάρτητο πρόγραμμα, μπορεί να καλύψει σχεδόν οποιαδήποτε γλώσσα αλλά θέλει και το διάβασμα του. 

    ΥΓ: Καλό είναι να ψάξεις μάλιστα μήπως υπάρχουν ήδη parsers για το είδος του function που χρειάζεσαι. Μία αναζήτηση και μόνο για F# math parser γυρίζει άπειρα παραδείγματα

     


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  04-10-2013, 10:22 74465 σε απάντηση της 74459

    Απ: Προσθήκη συναρτήσεων δυναμικά σε F#

    Δεν έχω ασχοληθεί με F#, αλλά αν θέλεις function parser έχουν γραφτεί πολλοί σε άλλες γλώσσες του .net (ψάξε στο CodeProject). Φαντάζομαι ότι κάποιος απ' αυτούς θα σε καλύψει. Δεν έχεις παρά να σκεφτείς μία "σύμβαση" βάσει της οποίας θα δηλώνεις τις μεταβλητές σου (π.χ. [%myVariable1%], [%myVariable2%] κ.ο.κ) και να αποθηκεύεις τις συναρτήσεις ως strings. Όταν θελήσεις να τις υπολογίσεις, αντικαθιστάς τις μεταβλητές με τις αριθμητικές τους τιμές, καλείς τον parser και τελείωσες. Αν, τώρα, οι ανάγκες σου είναι διαφορετικές, νομίζω ότι θα βοηθήσει να δώσεις ένα παράδειγμα μιας συνάρτησης.

    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
  •  04-10-2013, 16:19 74467 σε απάντηση της 74464

    Απ: Προσθήκη συναρτήσεων δυναμικά σε F#

    Ευχαριστώ πολύ, παιδιά! Θα ψάξω για όλα αυτά που μου είπατε Yes
    Θέμης
    twitter: @devopterios
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems