c++ expression evaluation

Giorgos Keramidas keramida at ceid.upatras.gr
Wed Jan 28 22:46:46 EET 2009


On Wed, 28 Jan 2009 22:19:14 +0200, Evaggelos Balaskas <ebalaskas at ebalaskas.gr> wrote:
> γιώργη αυτό
>
> ((())(()(()()(()))
>
> δεν είναι ούτε πρόγραμμα ούτε καν γλώσσα προγραμματισμού.
>
> σαν να διαβάζω Faust σε λίγο θα μας πεις να γράφουμε κι έτσι:
>
> 001110011000101010010110001

Πριν από 20 χρόνια αν έλεγες σε κάποιον ότι αυτό:

  for l in file('/etc/passwd'):
      pw = l.rstrip('\r\n').split(':')
      print "%s uses %s" % (pw[0], pw[len(pw)-1])

είναι executable κώδικας, θα σε κοιτούσε απορημένος λίγο και μετά θα σου
ζητούσε το τηλέφωνο του τύπου που σε προμηθεύει ΤΟΣΟ καλά ναρκωτικά.

Ε περίπου το ίδιο ισχύει και για το:

  (with-open-file (s "/etc/passwd" :direction :input)
    (loop for line = (read-line s nil 'eof)
         until (eq line 'eof)
         do (let ((pw (string-split line ":")))
              (format "~A ~A~&"
                      (aref pw 0) (aref pw (1- (array-dimension pw 0)))))))

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

Η μόνη διαφορά που υπάρχει στο πώς γράφεις κώδικα στις δύο γλώσσες είναι
ότι στη δεύτερη μπορείς να «κρύψεις» ένα μέρος της πολυπλοκότητας πίσω
από πολύ extensible macros σε οποιοδήποτε στάδιο της γλώσσας (από τη
στιγμή που «διαβάζεται» ο κώδικας από τον interpreter μέχρι τη στιγμή
που μετατρέπεται σε γλώσσα μηχανής, και τελικά να γράφεις κάτι σαν:

  (map-file (lambda (line)
              (let ((pw (string-split line ":")))
                (format "~A ~A~&" [pw 0] [pw (1- len)])))
    "/etc/passwd")

Και πάλι το indentation είναι αυτό που μετράει 99% και οι παρενθέσεις
είναι απλά «βοήθημα» προς τον editor σου για να μπορείς να μορφοποιήσεις
και να μεταφέρεις κομμάτια κώδικα τριγύρω :-)



More information about the Linux-greek-users mailing list