Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Γιατί όταν λες "Μια λίστα δέχεται μεθόδους" ο άλλος καταλαβαίνει ότι εννοείς αυτό:

List<method> list1 = new List<method>() { EmptyMethod1(), EmptyMethod2()};

Το οποίο δεν γίνεται!

 

 

Sorry για το off topic :)

var list = new List<Action>() {
    () => Console.WriteLine("a"),
    () => Console.WriteLine("b")
};

list.ForEach(x => x());
  • Like 1
  • Απαντ. 505
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

Δημοσ.

 

Sorry για το off topic :)

var list = new List<Action>() {
    () => Console.WriteLine("a"),
    () => Console.WriteLine("b")
};

list.ForEach(x => x());

:o

Άρα ο Μ2000 είχε δίκιο σε αυτό ε ?

 

Ντάξει... όπως είπα σε προηγούμενο μήνυμα δεν έχω καλύψει τις δομές δεδομένων ακόμα, είναι το επόμενο κεφάλαιο του βιβλίου απ' όπου μαθαίνω, από κει που είμαι τώρα.

 

Και θυμάμαι να έχω διαβάσει κάπου πως ξεκαθάριζαν ρητά ότι άλλο πράγμα τα δεδομένα (τα οποία απλά υπάρχουν παθητικά, χωρίς λειτουργικότητα, και δεν κάνουν κάτι ενεργητικά τα ίδια), και άλλο οι εκφράσεις / συναρτήσεις που δρουν ενεργητικά στα δεδομένα και έχουν λειτουργικότητα.

 

Έτσι λοιπόν αφού μιλάμε για "δομή δεδομένων" θεώρησα πως μια δομή δεδομένων θα μπορεί να λάβει  μόνο δεδομένα, δηλαδή μόνο παθητικές πληροφορίες, και όχι πχ συναρτήσεις.

Δημοσ.

Offtopic συνέχεια...

 

Και το τελείως empty επίσης γίνεται:

var list = new List<Action>() { () => {}, () => {}, () => {}, };

αν και βέβαια δε μπορείς να κάνεις τίποτα ενδιαφέρον έτσι.

 

Το ίδιο σε C++

vector<function<void(void)>> list { [](){}, [](){} };

αν και εδώ πλέον φτάνει να μοιάζει με trolling.  :-D

 

That said, σε καμία από τις δύο γλώσσες δεν είναι "μέθοδοι" αυτό που βάζεις μέσα επειδή καμία από τις δύο δεν έχει first class functions. Αλλά υπάρχουν γλώσσες που έχουν (πχ JavaScript).

  • Like 1
Δημοσ.

Μια λάμβδα έκφραση δεν έχει τύπο, συνεπώς δεν μπορει να χρησιμοποιηθεί για να εξαχθεί ο τύπος μιας

τοπικής μεταβλητής. Ως εκ τούτου, π.χ. το

 var v = x => x;

θα δώσει σφάλμα. Ομοίως είναι λανθασμένο το

var list = new List<Action>()  ....κλπ

που αναφέρθηκε παραπάνω.

 

 

Τέλος, μπορεί να γραφεί χωρίς πρόβλημα κάτι σαν το ακόλουθο

public static bool GreaterThan(int first,int second)
{ return first>second; } 

public static bool AlphabeticalGreaterThan(int first,int second)
{  return (first.ToString().CompareTo(second.ToString()))> ? 1 : 0; }

List<Func<int,int,bool>> list = new List<Func<int,int,bool>> {GreaterThan, AlphabeticalGreaterThan };
...
bool q = list[0](5,3);





-

  • Like 1
Δημοσ.

No, please. Όσοι γράφουν τέτοια πράγματα πρέπει να τους ρίχνουν στην φωτιά (Γενικά μιλάω, όχι για σένα προσωπικά DDevil, καταλαβαίνω πως είναι παράδειγμα).

 

Φιλε ετσι ειναι η C παρέχει ευελιξια και ελευθερια!!! Που να γράφαμε και για πολύπλοκες δηλώσεις -.-

Δημοσ.

Μια λάμβδα έκφραση δεν έχει τύπο, συνεπώς δεν μπορει να χρησιμοποιηθεί για να εξαχθεί ο τύπος μιας τοπικής μεταβλητής. Ως εκ τούτου, το

 

 var v = x => x;

θα δώσει σφάλμα.

Ομοίως είναι λανθασμένο το

var list = new List<Action>()  ....κλπ

που αναφέρθηκε παραπάνω.

 

Τέλος, μπορεί να γραφεί κάτι σαν το παρακάτω

public static bool GreaterThan(int first,int second)
{ return first>second; } 

public static bool AlphabeticalGreaterThan(int first,int second)
{  return (first.ToString().CompareTo(second.ToString()))> ? 1 : 0; }

List<Func<int,int,bool>> list = new List<Func<int,int,bool>> {GreaterThan, AlphabeticalGreaterThan };
...
bool q = list[0](5,3);







-

 

Λανθασμένο για ποιο λόγο; Περνάει κανονικά compile και το αποτέλεσμα είναι το expected.

Φιλε ετσι ειναι η C παρέχει ευελιξια και ελευθερια!!! Που να γράφαμε και για πολύπλοκες δηλώσεις -.-

 

Καλό είναι να αποφεύγονται τέτοιες πρακτικές αν πρόκειται κάποιος να δουλέψει σε ένα σοβαρό project (maintainability, κλπ.). Για την πάρτη μας everything goes, αλλά αν πρόκειται να μπλέξει και άλλος κόσμος -> KISS.

Δημοσ.

Ναι, έχεις δίκιο, έγραψα απρόσεκτα. Το

 

var list = new List<Action>()..

 

κάνει compile διότι ο τύπος εξάγεται. Ωστόσο, το

var v = x => x;

 

θα "χτυπήσει" οπωσδήποτε.

 

-

Δημοσ.

Ας γυρίσουμε στο κόσκινο του Όιλερ, να κάνει την άσκηση του ο Alithinos...

Δημοσ.

Και η Μ2000 έχει first class functions...

 

image.png?w=400&c=1

Φιλε ετσι ειναι η C παρέχει ευελιξια και ελευθερια!!! Που να γράφαμε και για πολύπλοκες δηλώσεις -.-

 

Hold your horses cowboy, τέτοια ασχολίαστα for μπορείς να γράψεις σε οποιαδήποτε γλώσσα.

 

Και στη M2000 μπορείς, γιατί εκεί τα for υλοποιούνται με συνάρτηση τραμπολίνο που μπορεί να επιστρέψει την εκτέλεση στο προηγούμενο σημείο του αντικειμένου.

Επισκέπτης
Δημοσ.
List<method> list1 = new List<method>() { EmptyMethod1(), EmptyMethod2()};

Το οποίο δεν γίνεται!

Για αυτό και σου κάνουν παρατηρήσεις και σε κράζουν.

 

Γίνεται, αλλά με Reflection. Παράδειγμα:

class Program {
        public Program() {
        }

        static void Main(string[] args) {
            List<string> methods = new List<string>() { "Method1", "Method2" };
            foreach (string methodName in methods) {
                object tmpObj = new Program();
                MethodInfo mi = tmpObj.GetType().GetMethod(methodName);
                object[] paramsArray = new object[] { };
                mi.Invoke(tmpObj, paramsArray);
            }
        }

        public static void Method1() {
            Console.WriteLine("Executing method 1");
        }

        public static void Method2() {
            Console.WriteLine("Executing method 2");
        }
    }
Δημοσ.

Τώρα κάνουμε αστεία με τη Μ2000;

Λοιπόν στη Μ2000,η For γίνεται τουλάχιστον μια φορά, γιατί ο έλεγχος γίνεται μετά την εκτέλεση του μπλοκ. Μπορεί μια Προς (Goto) όμως να βγάλει τη ροή από το μπλοκ σαν να μην υπήρχε For.

Η Μ2000 έχει ανώνυμες συναρτήσεις. Και άλλα πολλά.

  • Like 1
Δημοσ.

Τώρα κάνουμε αστεία με τη Μ2000;

Λοιπόν στη Μ2000,η For γίνεται τουλάχιστον μια φορά, γιατί ο έλεγχος γίνεται μετά την εκτέλεση του μπλοκ. Μπορεί μια Προς (Goto) όμως να βγάλει τη ροή από το μπλοκ σαν να μην υπήρχε For.

Η Μ2000 έχει ανώνυμες συναρτήσεις. Και άλλα πολλά.

 

Ρε άστους να λένε τα δικά τους. Θα εξαπλωθεί η Μ2000 και θα την βλέπουνε παντού κα θα λυσάνε. :cry:

 

Τι θα σου κάνουν??? θα σου κοψουν το μισθο? χαχαχα

Δημοσ. (επεξεργασμένο)

Όταν ξεκίνησα τη γλώσσα δεν είχα φανταστεί που θα έφτανε, σε ολοκλήρωση.

Περίμενα να βρω άτομα που θα βοηθούσαν,θα εμπλούτιζαν, αλλά μάλλον ζητάω πολλά. Είναι βαρύ το θέμα.

Παράδειγμα συναρτησιακού προγραμματισμού σε Μ2000.

http://georgekarras.blogspot.gr/2015/09/2000_70.html

Χρησιμοποιεί τις ανώνυμες συναρτήσεις.

Επεξ/σία από M2000

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...