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

Γενικό thread αποριών για τη C#.


Alithinos

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

Γίνεται, αλλά με Reflection. 

 

Ε δεν είναι το ίδιο αυτό το πράγμα. Έχεις ένα πίνακα με απλά strings, το γεγονός ότι από αυτά καταλήγεις να κάνεις οτιδήποτε δεν αλλάζει ότι ο πίνακας περιέχει strings.

 

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

 

Ζητάς πολλά και δεν προσφέρεις απολύτως τίποτα (δεν εννοώ λεφτά). Και γι' αυτό δεν πρόκειται να βρεις ποτέ κανέναν έμπειρο. Αλλά επειδή το project όπως το έχεις είναι τελείως εκτός δυνατοτήτων για κάποιον μη έμπειρο, ούτε και τέτοιον θα βρεις. Τώρα αν σε βολεύει να πιστεύεις πως αυτό συμβαίνει επειδή κανένας δεν έχει τα φόντα, whatever.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 505
  • Δημ.
  • Τελ. απάντηση

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

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

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

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

Εδώ είναι ένα θέμα που έβαλα σήμερα για τις First Class Functions στην Μ2000 και σχετίζεται με το ζήτημα που υπάρχει εδώ:

 

Σε διάφορες γλώσσες

https://rosettacode.org/wiki/First-class_functions

 

Σε Μ2000 με διάφορους τρόπους

http://georgekarras.blogspot.gr/2016/04/m2000-first-class-functions.html

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ε αυτόν είπα άνω τελεία.  :P

Ντάξει κατάλαβα τι εννοείς.

Όχι δεν γίνεται.

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

Ένα μικρό μάθημα για for.

 

 

Η for έχει την εξής σύνταξη:

 

for (
  initialization<statement_termination> 
  execution_before_each_iteration<statement_termination> 
  execution_after_each_iteration<statement_termination>
) 
- Το <statement_termination> είναι το γνωστό ;

- Το initialization γίνεται μία φορά. Στην αρχή.

- Το execution_before_each_iteration γίνεται κάθε φορά πριν την εκτέλεση του body του for και ελέγχεται εάν η τιμή του είναι 0 ή κάτι άλλο

- Το execution_after_each_iteration γίνεται κάθε φορά μετά το body και δεν ελέγχεται η τιμή του.

 

Για αυτό, μπορεί κανείς να δει σε μερικά λειτουργικά ή αντί-λειτουργικού συστήματα δηλώσεις όπως:

 

for(;; {
  // code
}
Αυτό είναι ισοδύναμο με το

 

while(1) {
  // code
}
Γενικά μπορείς να κάνεις πολλά ωραία με την for... π.χ. να χρησιμοποιείς ταυτόχρονα δύο running indices, να παραλήψεις το execution_after_each_iteration, να μην βάλεις τίποτα μέσα για να έχεις το main loop του λειτουργικού σου όπως κάνανε (ελπίζω να μην κάνουν ακόμα) στο Windows κτλ.

 

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

 

 

Αλλά δεν είναι κάτι να σε μπερδεύει.

 

 

Τώρα, σημαντικό στους πρώτους είναι η αποθήκευση και η ταχύτητα. Πως θα δεις εάν ένας αριθμός με 10^8 ψηφία είναι πρώτος; Καταρχάς, σε τι μεταβλητή/δομή θα τον εχωρέσεις; Σε πόση ώρα θα γίνει ο έλεγχός του;

 

Π.χ. με βάσει όλα τα παραπάνω και για την **απλή** περίπτωση που εξετάζεις εδώ, κάτι τέτοιο θα μπορούσε να τρέξει πιο γρήγορα:

 

#include <stdlib.h>
#include <stdio.h>

int main() {
  int a, b, n, r;
  b = a = 99;
  n = 2;

  for (; n<b; b=a/(n++)) {
    if (!(r = a%n)) {
      printf("%d not prime. Division with %d\n", a, n);
      break;
    }
  }

  if (r) printf("%d is a prime\n", a);

  return 0;
}
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Σε διάφορες γλώσσες

https://rosettacode.org/wiki/First-class_functions

 

Σε Μ2000 με διάφορους τρόπους

http://georgekarras.blogspot.gr/2016/04/m2000-first-class-functions.html

 

Ανάθεμα αν μπορώ να καταλάβω πώς είναι δυνατόν να έχει διαβάσει κανείς το πρώτο link που δίνεις και να πιστεύει ότι στο δεύτερο βλέπουμε first class functions (παρόλο που ο ορισμός του first class function είναι κάπως φλου, προσωπικά το εννοώ με ακόμα πιο αυστηρή έννοια).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ε δεν είναι το ίδιο αυτό το πράγμα. Έχεις ένα πίνακα με απλά strings, το γεγονός ότι από αυτά καταλήγεις να κάνεις οτιδήποτε δεν αλλάζει ότι ο πίνακας περιέχει strings.

 

Ναι αλλά τη δουλειά την κάνεις, αυτό έχει σημασία.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εννοώ ότι το όποιο είδους value έχεις για να αντιπροσωπεύει μια function πρέπει να "είναι" η function, όχι κάποιου είδους function pointer ή οτιδήποτε άλλο. Π.χ. στη C# πραγματικά for all practical purposes έχεις first-class functions, αλλά στην ουσία είναι function pointers.

 

Είναι λίγο "pure" ο ορισμός όπως τον αντιλαμβάνομαι εγώ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Πρεπει να μπορεις να θέτεις σε μεταβλητή μια function, όχι την τιμή της function αν κληθει.

//a είναι τυπου function που δέχεται 2 int και επιστρεφει int 
//b είναι int 

a = myPowFunction;  
b = a(2,3) //b=2^3
a = mySumFunction;
b = a(2,3) //b=2+3


Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Άρα είμαι οκ.. διότι ενώ το & δηλώνει αναφορά σε τιμή, στις συναρτήσεις είναι ο κώδικας!

π.χ.

Def A(x)=x^3

A$=&A()

Def A(x)=x

Print Function(A$,3), A(3) \\ 27 , 3

το Α$ δεν είναι δείκτης στην Α(), εδώ αλλάζω την Α() (αυτό γίνεται στη Μ2000) αλλά το Α$ δεν είναι δείκτης, έχει το κώδικα μέσα του!

 

Το Def ορίζει μια συνάρτηση μιας γραμμής. Είναι macro στην ουσία

Κανονικά είναι αυτό:

 

Function A {

    Read X

    =X^3

}

 

 

 

Η Μ2000 δεν έχει signatures στις συναρτήσεις, εκτός από το όνομα που εδώ σίγουρα δεν γυρίζει αλφαριθμητικό. Θα μπορούσε να μην γύριζε τιμή ή να γύρναγε πίνακα ή κάποιο αντικείμενο.

Αυτό σημαίνει ότι όταν καλέσουμε μια ανώνυμη πρέπει να επιλέξουμε αν θα την καλέσουμε με Function() ή Function$() ή απλά θα την καλέσουμε Call Void Α$  (πετάμε πιθανή επιστροφή) ή Call Α$ αν υπάρχει μη μηδενική επιστροφή παράγεται λάθος και το στοιχείο αυτό αναφέρεται).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπορείς αν την συνδέσεις με ένα όνομα. Αυτό που γράφεις θα έλεγε με μια ματιά "γυρνάω αλφαριθμητικό και είμαι ή πίνακας ή συνάρτηση".  Αλλά εν τέλει ο τρόπος είναι δευτερεύουσας σημασίας. Εδώ μετράει αν μπορώ να καλέσω μια συνάρτηση και στην επιστροφή να πάρω ως αποτέλεσμα μια συνάρτηση! Αυτό γίνεται, αφού η μεταβίβαση προς τα πίσω μια συνάρτησης (του κώδικά της) είναι μεταβίβαση αλφαριθμητικού! 

Στο παράδειγμα δεν έχω επιστροφή συνάρτησης.

 

Def A(X)=X^3 \\ same as X**3
\\ A$ points to A() using weak reference
A$=Lazy$(A(Number))
\\ B$ hold a copy of current A()
B$=&A()
\\ we change the function's code
Def A(X)=X*2
\\ A$ has lazy evaluation, so we call the new one
\\ B$ has function as value, so has the old one
Print Function(A$,10), Function(B$,10) '20  1000
\\ connect to a name
Link Weak A$ to D1()
Link Weak B$ to D2()
Print D1(10), D2(10) '20  1000
Def A(X)=X/2
Print D1(10), D2(10) '5  1000   δες εδώ που η D10 άλλαξε αποτέλεσμα...επειδή αλλάξαμε την Α(), ενώ η D2() βράχος!

 

 

Εδώ είναι με επιστροφή συνάρτησης που γίνεται από δυο άλλες!

Ουσιαστικά καλούμε έτσι Α$=Compose$(&D1(),&D2())  το &D1() δίνει αλφαριθμητικό με το κώδικα της D1, στο Α$, και αυτό στην επιστροφή μπαίνει σε ένα { } έτσι το τελικό αλφαριθμητικό περιέχεται σε μπλοκ και περιέχει δυο μπλοκ με τις Α$ και Β$...

Function Compose$ {
      Read A$, B$
      ="{=Function({"+B$+"}, Function({"+A$+"}, Number))}"
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπορείς αν την συνδέσεις με ένα όνομα. Αυτό που γράφεις θα έλεγε με μια ματιά "γυρνάω αλφαριθμητικό και είμαι ή πίνακας ή συνάρτηση".  Αλλά εν τέλει ο τρόπος είναι δευτερεύουσας σημασίας. Εδώ μετράει αν μπορώ να καλέσω μια συνάρτηση και στην επιστροφή να πάρω ως αποτέλεσμα μια συνάρτηση! Αυτό γίνεται, αφού η μεταβίβαση προς τα πίσω μια συνάρτησης (του κώδικά της) είναι μεταβίβαση αλφαριθμητικού! 

 

Το κόκκινο είναι τελείως λάθος (απλά δεν ξέρεις που έχουμε πει τόσες φορές) και το πράσινο απλά το επιβεβαιώνει. Αυτό που μεταχειρίζεσαι δεν είναι συνάρτηση, είναι το source code για μια συνάρτηση. Με τη λογική αυτή όποια γλώσσα έχει eval() έχει και first-class functions, πράγμα που είναι τέλος πάντων ας μη πούμε τι είναι, τα έχουμε ξαναπεί.

 

Εν τέλει και συ eval() κάνεις σε κάποιο σημείο. Και το αστείο είναι ότι το πρώτο link που εσύ ο ίδιος έδωσες παραπάνω και που σχολίασα λέει ξεκάθαρα "if it can do each of the following without recursively invoking a compiler or interpreter or otherwise metaprogramming".

 

Σόρι αλλά για άλλη μια φορά είσαι απλά απογοητευτικός.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Defacer, λέει recursively, αυτό πώς συμβαίνει εδώ;

(και τέλος πάντων εξήγησε...)

 

Όταν λέει recursively δεν εννοεί βέβαια "μη κάνεις eval κώδικα που κάνει eval κώδικα που κάνει eval κώδικα". Εννοεί πως ο compiler έκανε τη δουλειά του μια φορά ήδη πριν ξεκινήσει να τρέχει το πρόγραμμά σου. Αν το πρόγραμμά σου κατά τη διάρκεια της εκτέλεσής του ξανακαλέσει τον compiler προκειμένου να μπορέσει να συνεχίσει την εκτέλεση του εαυτού του, αυτό είναι recursive.

 

Αν δε σου αρέσει αυτός ο ορισμός μπορείς απλά να τον αγνοήσεις και να κρατήσεις το "or otherwise metaprogramming", στο οποίο δεν πάει το recursive και βασικά υπάρχει για να πει "ή με οποιοδήποτε άλλο τρόπο μπορεί να σκεφτείς να το κάνεις".

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

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

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