summaryrefslogtreecommitdiffhomepage
path: root/el-gr
diff options
context:
space:
mode:
Diffstat (limited to 'el-gr')
-rw-r--r--el-gr/bash-gr.html.markdown2
-rw-r--r--el-gr/ocaml-gr.html.markdown381
-rw-r--r--el-gr/rust-gr.html.markdown339
-rw-r--r--el-gr/vim-gr.html.markdown2
4 files changed, 722 insertions, 2 deletions
diff --git a/el-gr/bash-gr.html.markdown b/el-gr/bash-gr.html.markdown
index 2989969d..239beaa4 100644
--- a/el-gr/bash-gr.html.markdown
+++ b/el-gr/bash-gr.html.markdown
@@ -8,7 +8,7 @@ lang: el-gr
---
Η λέξη «bash» είναι ένα από τα ονόματα του unix shell (τερματικός), το οποίο
-διανέμεται επίσης ως προεπιλεγμένος τερματικός για το λειτουργικό σύστημα GNU, τα Linux και τα Mac OS X.
+διανέμεται επίσης ως προεπιλεγμένος τερματικός για το λειτουργικό σύστημα GNU, τα Linux και τα macOS.
Σχεδόν όλα τα παραδείγματα που ακολουθούν μπορούν να αποτελέσουν μέρος ενός
προγράμματος τερματικού (shell script) ή να εκτελεσθούν απευθείας από τον
τερματικό.
diff --git a/el-gr/ocaml-gr.html.markdown b/el-gr/ocaml-gr.html.markdown
new file mode 100644
index 00000000..9a15b2d3
--- /dev/null
+++ b/el-gr/ocaml-gr.html.markdown
@@ -0,0 +1,381 @@
+---
+language: OCaml
+filename: learnocaml-gr.ml
+contributors:
+ - ["Daniil Baturin", "http://baturin.org/"]
+translators:
+ - ["Chariton Charitonidis", "https://github.com/haritonch"]
+lang: el-gr
+---
+
+Η OCaml είναι μία strictly evaluated συναρτησιακή γλώσσα με κάποια στοιχεία
+προστακτικού προγραμματισμού.
+
+Μαζί με την StandardML και τις διαλέκτους της, ανήκει στην οικογένεια ML γλωσσών.
+Η F# είναι επίσης αρκετά επιρρεασμένη από την OCaml.
+
+Ακριβώς όπως η StandardML, η OCaml διαθέτει έναν interpreter, που μπορεί να
+χρησιμοποιηθεί διαδραστικά, αλλά και έναν compiler.
+Το εκτελέσιμο αρχείο του interpreter κανονικά έχει το όνομα "ocaml" και ο compiler
+έχει το όνομα "ocamlopt".
+Υπάρχει και ένας bytecode compiler "ocamlc", αλλά δεν υπάρχουν πολλοί λόγοι να το
+χρησιμοποιήσει κάποιος.
+
+Είναι ισχυρά και στατικά τυποποιημένη. Παρ'όλα αυτά , δεν χρειάζεται ο
+προγραμματιστής να δηλώνει τους τύπους, καθώς συμπερασμός τύπων γίνεται με τον
+αλγόριθμο του συστήματος τύπων Hindley-Milner. Αυτό κάνει τις δηλώσεις τύπων μη
+αναγκαίες στις περισσότερες περιπτώσεις, αλλά μπορεί να είναι δύσκολο στην αρχή.
+
+Όταν είμαστε στο toplevel της OCaml (read-eval-print-loop), η OCaml τυπώνει τον
+τύπο που συμπεραίνει όταν εισάγουμε μια έκφραση.
+
+```
+# let inc x = x + 1 ;;
+val inc : int -> int = <fun>
+# let a = 99 ;;
+val a : int = 99
+```
+Για ένα source αρχείο μπορούμε να χρησιμοποιούμε την εντολή
+"ocamlc -i /path/to/file.ml" στο terminal για να τυπώσει όλα τα ονόματα και
+τους τύπους.
+
+```
+$ cat sigtest.ml
+let inc x = x + 1
+let add x y = x + y
+
+let a = 1
+
+$ ocamlc -i ./sigtest.ml
+val inc : int -> int
+val add : int -> int -> int
+val a : int
+```
+
+Σημειώστε ότι τα type signatures των συναρτήσεων με πολλά ορίσματα είναι
+γραμμένα σε curried form. Μια συνάρτηση με πολλά ορίσματα μπορεί να
+αναπαρασταθεί ως σύνθεση συναρτήσεων με μόνο ένα όρισμα.
+Η "f(x,y) = x + y" από το παράδειγμα, όταν εφαρμόζεται στα ορίσματα 2 και 3
+είναι ισοδύναμη με την εφαρμογή της "f0(y) = 2 + y" στο 3. Γι' αυτό έχει τύπο
+"int -> int -> int".
+
+
+```ocaml
+(*** Comments ***)
+
+(* Τα σχόλια περικλείονται σε (* και *). Μπορούν να είναι και εμφωλευμένα *)
+
+(* Δεν υπάρχει ειδικό σύμβολο για σχόλια μιας γραμμής *)
+
+
+(*** Μεταβλητές και Συναρτήσεις ***)
+
+(* Οι εκφράσεις διαχωρίζονται από διπλό semicolon, ";;".
+ Σε πολλές περιπτώσεις είναι περιττό, αλλά εδώ θα το χρησιμοποιούμε σε
+ κάθε έκφραση για ευκολότερο copy-paste στο interpreter shell.
+ Το να χρησιμοποιούμε περιττά ;; σε αρχεία κώδικα θεωρείται συνήθως
+ κακό στυλιστικά. *)
+
+(* Οι δηλώσεις μεταβλητών και συναρτήσεων χρησιμοποιούν το keyword "let" *)
+let x = 10 ;;
+
+(* Η OCaml επιτρέπει χαρακτήρες μονών εισαγωγικών σε identifiers.
+ το μονό εισαγωγικό δεν έχει κάποια σημασία σε αυτή την περίπτωση,
+ χρησιμοποιείται συνήθως σε περιπτώσεις που σε άλλες γλώσσες χρησιμοποιούμε
+ ονόματα όπως "foo_tmp". *)
+let foo = 1 ;;
+let foo' = foo * 2 ;;
+
+(* Από τη στιγμή που ο compiler της OCaml συμπεραίνει τους τύπους αυτόματα,
+ κανονικά δεν χρειάζεται να δηλώνουμε ρητά τον τύπο ορισμάτων. Παρ'όλα αυτά
+ μπορούμε να το κάνουμε αν θέλουμε ή χρειάζεται *)
+let inc_int (x: int) : int = x + 1 ;;
+
+(* Μία από αυτές τις περιπτώσεις που είναι αναγκαίο να δηλώσουμε ρητά τύπους
+ είναι για να λύσουμε την αμφισημία μεταξύ δύο record types που έχουν πεδία με
+ όμοια ονόματα. Η εναλλακτική είναι να βάλουμε αυτούς τους τύπους σε modules,
+ αλλά και τα δύο αυτά θέματα είναι εκτός του σκοπού αυτού το μαθήματος. *)
+
+(* Πρέπει να δηλώνουμε ότι μία συνάρτηση είναι αναδρομική με "rec". *)
+let rec factorial n =
+ if n = 0 then 1
+ else n * factorial (n-1)
+;;
+
+(* H εφαρμογή συναρτήσεων συνήθως δεν χρειάζεται παρενθέσεις γύρω από ορίσματα *)
+let fact_5 = factorial 5 ;;
+
+(* ...εκτός αν τα ορίσματα είναι εκφράσεις *)
+let fact_4 = factorial (5-1) ;;
+let sqr2 = sqr (-2) ;;
+
+(* Κάθε συνάρητση πρέπει να έχει τουλάχιστον ένα όρισμα.
+ Από τη στιγμή που κάποιες συναρτήσεις, από τη φύση τους, δεν παίρνουν κάποιο
+ όρισμα, υπάρχει ο τύπος "unit" που έχει μόνο μία τιμή,
+ την οποία γράφουμε ως "()". *)
+let print_hello () = print_endline "hello world" ;;
+
+(* Προσέχετε ότι πρέπει να γράφουμε το "()" ως όρισμα και όταν την καλούμε. *)
+print_hello () ;;
+
+(* Το να καλούμε μια συνάρτηση με λιγότερα ορίσματα από όσα δέχεται
+ δεν προκαλεί πρόβλημα, απλά παράγει μια νέα συνάρτηση. *)
+let make_inc x y = x + y ;; (* make_inc is int -> int -> int *)
+let inc_2 = make_inc 2 ;; (* inc_2 is int -> int *)
+inc_2 3 ;; (* Αποτιμάται σε 5 *)
+
+(* Μπορούμε να χρησιμοποιούμε πολλές εκφράσεις στο σώμα μιας συνάρτησης.
+ Η αποτίμηση της τελευταίας έκφρασης είναι η τιμή που επιστρέφει η συνάρτηση.
+ Όλες οι ενδιάμεσες εκφράσεις πρέπει να είναι τύπου "unit".
+ Αυτό είναι ιδιαίτερα χρήσιμο όταν γράφουμε σε προστακτικό στυλ, η απλούστερη
+ μορφή αυτού είναι η εισαγωγή ενός debug print. *)
+let print_and_return x =
+ print_endline (string_of_int x);
+ x
+;;
+
+(* Ως συναρτησιακή γλώσσα η OCaml δεν έχει "procedures" (διαδικασίες).
+ Κάθε συνάρτηση πρέπει να επιστρέφει κάτι. Οπότε, συναρτήσεις που δεν
+ επιστρέφουν κάτι και καλούνται μόνο για τις παρενέργειες τους,
+ όπως η print_endline, επιστρέφουν τιμή τύπου "unit". *)
+
+
+(* Οι ορισμοί μπορούν να γίνουν αλυσιδωτά με τη δομή "let ... in".
+ Αυτό είναι περίπου το ίδιο με το να αναθέτουμε τιμές σε πολλές μεταβλητές
+ πριν τις χρησιμοποιήσουμε σε εκφράσεις σε προστακτικές γλώσσες. *)
+let x = 10 in
+let y = 20 in
+x + y ;;
+
+(* Εναλλακτικά μπορούμε να χρησιμποιούμε τη δομή "let ... and ... in".
+ Αυτό είναι εξαιρετικά χρήσιμο για αμοιβαία αποκλειόμενες συναρτήσεις,
+ όπυ με "let .. in", ο compiler θα παραπονιόταν για unbound values *)
+let rec
+ is_even = function
+ | 0 -> true
+ | n -> is_odd (n-1)
+and
+ is_odd = function
+ | 0 -> false
+ | n -> is_even (n-1)
+;;
+
+(* Οι ανώνυμες συναρτήσεις χρησιμοποιούν την εξής σύνταξη: *)
+let my_lambda = fun x -> x * x ;;
+
+(*** Τελεστές ***)
+
+(* Δεν υπάρχει ιδιαίτερη διάκριση ανάμεσα σε τελεστές και συναρτήσεις.
+ Κάθε τελεστής μπορεί να κληθεί ως συνάρτηση. *)
+
+(+) 3 4 (* Same as 3 + 4 *)
+
+(* Υπάρχει ένας αριθμός built-in τελεστών. Ένα ασυνήθιστο χαρακτηριστικό είναι
+ ότι η OCaml δεν μπορεί να κάνει έμμεση μετατροπή τύπων
+ ανάμεσα σε ακεραίους και floats, επίσης, χρησιμοποιεί διαφορετικούς τελεστές
+ για τους floats (αριθμούς κινητής υποδιαστολής) *)
+12 + 3 ;; (* Πρόσθεση ακεραίων. *)
+12.0 +. 3.0 ;; (* Πρόσθεση κινητής υποδιαστολής. *)
+
+12 / 3 ;; (* Διαίρεση ακεραίων. *)
+12.0 /. 3.0 ;; (* Διαίρεση κινητής υποδιαστολής. *)
+5 mod 2 ;; (* Υπόλοιπο. *)
+
+(* Το ενός-ορίσματος μείον είναι αξιοσημείωτη εξαίρεση, είναι πολυμορφικό.
+ Ωστόσο, έχει καθαρές μορφές ακεραίων και float. *)
+- 3 ;; (* Πολυμορφικό, ακέραιοι *)
+- 4.5 ;; (* Πολυμορφικό, float *)
+~- 3 (* Μόνο για integer *)
+~- 3.4 (* Type error *)
+~-. 3.4 (* Μόνο για float *)
+
+(* Μπορούμε να ορίζουμε δικούς μας τελεστές ή να ξανα-ορίσουμε υπάρχοντες.
+ Σε αντίθεση με την SML ή τη Haskell, μόνο ορισμένα σύμβολα μπορούν να
+ χρησιμοποιηθούν για ονόματα τελεστών και το πρώτο σύμβολο ορίζει την
+ επιμεριστικότητα και προτεραιότητα πράξεων. *)
+let (+) a b = a - b ;; (* και καλή τύχη στον επόμενο... *)
+
+(* Πιο χρήσιμο: ένας τελεστής αντιστρόφου για floats.
+ οι τελεστές ενός-ορίσματος πρέπει να ξεκινούν με "~". *)
+let (~/) x = 1.0 /. x ;;
+~/4.0 (* = 0.25 *)
+
+
+(*** Built-in δομές δεδομένων ***)
+
+(* Οι λίστες περικλείονται από αγκύλες και τα στοιχεία τους
+ διαχωρίζονται με semicolons. *)
+let my_list = [1; 2; 3] ;;
+
+(* Οι tuples (προαιρετικά) περικλείονται από παρενθέσεις, τα στοιχεία τους
+ διαχωρίζονται με κόμματα. *)
+let first_tuple = 3, 4 ;; (* Έχει τύπο "int * int". *)
+let second_tuple = (4, 5) ;;
+
+(* Συνέπεια: αν προσπαθήσεουμε να διαχωρίσουμε τα στοιχεία μιας λίστας
+ με κόμματα, θα πάρουμε μια λίστα με ένα tuple ως στοιχείο.
+ Μπορεί να την πατήσουμε εύκολα έτσι. *)
+let bad_list = [1, 2] ;; (* Becomes [(1, 2)] *)
+
+(* Μπρούμε να προσπελάσουμε στοιχεία μιας λίστας με τη συνάρτηση List.nth. *)
+List.nth my_list 1 ;;
+
+(* Yπάρχουν συναρτήσεις ανώτερης τάξης για λίστες, όπως οι map και filter. *)
+List.map (fun x -> x * 2) [1; 2; 3] ;;
+List.filter (fun x -> x mod 2 = 0) [1; 2; 3; 4] ;;
+
+(* Μπορούμε να προσθέτουμε στοιχεία στην αρχή μιας λίστας με τον
+ constructor "::", συνήθως αναφέρεται ως "cons". *)
+1 :: [2; 3] ;; (* Αποτέλεσμα: [1; 2; 3] *)
+
+(* Οι πίνακες Arrays περικλείονται από [| |] *)
+let my_array = [| 1; 2; 3 |] ;;
+
+(* Προσπελαύνουμε στοιχεία ενός πίνακα ως εξής: *)
+my_array.(0) ;;
+
+
+(*** Strings και Χαρακτήρες ***)
+
+(* Χρησιμοποιούμε διπλά εισαγωγικά για τα string literals. *)
+let my_str = "Hello world" ;;
+
+(* Μονά εισαγωγικά για τα literals χαρακτήρων. *)
+let my_char = 'a' ;;
+
+(* Τα μονά και τα διπλά εισαγωγικά δεν είναι ισοδύναμα. *)
+let bad_str = 'syntax error' ;; (* Syntax error. *)
+
+(* Αυτό μας δίνει ένα string με έναν χαρακτήρα και όχι εναν χαρακτήρα. *)
+let single_char_str = "w" ;;
+
+(* Τα strings παρατίθενται με τον τελεστή "^". *)
+let some_str = "hello" ^ "world" ;;
+
+(* Τα strings δεν είναι πίνακες από χαρακτήρες όπως στην C.
+ Δεν μπορούμε να ανακατεύουμε strings με χαρακτήρες σε εκφράσεις.
+ Μπορούμε να μετατρέπουμε χαρακτήρες σε strings με "String.make 1 my_char".
+ Υπάρχουν πιο βολικές συναρτήσεις για αυτό το σκοπό σε πρόσθετες βιβλιοθήκες,
+ όπως η Core.Std που μπορεί να μην έχουν εγκατασταθεί/φορτωθεί by default. *)
+let ocaml = (String.make 1 'O') ^ "Caml" ;;
+
+(* Υπάρχει και μια συνάρτηση printf. *)
+Printf.printf "%d %s" 99 "bottles of beer" ;;
+
+(* Υπάρχουν και συναρτήσεις read/write χωρίς μορφοποίηση. *)
+print_string "hello world\n" ;;
+print_endline "hello world" ;;
+let line = read_line () ;;
+
+
+(*** User-defined τύποι δεδομένων ***)
+
+(* Μπορούμε να ορίζουμε τύπους δεδομένων με τη δομή "type some_type".
+ Όπως σε αυτό τον άχρηστο τύπο που αντιγράφει τους ακεραίους: *)
+type my_int = int ;;
+
+(* Πιο ενδιαφέροντες τύποι περιλαμβάνουν τους λεγόμενους type constructors.
+ Αυτοί πρέπει να ξεκινούν με κεφαλαίο γράμμα. *)
+type ml = OCaml | StandardML ;;
+let lang = OCaml ;; (* Έχει τύπο "ml". *)
+
+(* Οι type constructors δε χρειάζεται να είναι κενοί. *)
+type my_number = PlusInfinity | MinusInfinity | Real of float ;;
+let r0 = Real (-3.4) ;; (* Έχει τύπο "my_number". *)
+
+(* Μπορούν να χρησιμοποιηθούν για πολυμορφική αριθμιτική *)
+type number = Int of int | Float of float ;;
+
+(* Σημείο στο επίπεδο, βασικά ένα tuple περιορισμένου συγκεκριμένου τύπου *)
+type point2d = Point of float * float ;;
+let my_point = Point (2.0, 3.0) ;;
+
+(* Οι τύποι μπορούν να είναι παραμετροποιημένοι, όπως σε αυτόν τον τύπο για
+ λίστες λίστών με οτιδήποτε τύπου στοιχεία. Το 'a μπορεί να αντικατασταθεί από
+ οποιονδήποτε τύπο. *)
+type 'a list_of_lists = 'a list list ;;
+type int_list_list = int list_of_lists ;;
+
+(* Οι τύποι μπορούν επίσης να ορίζονται αναδρομικά. Σαν αυτόν εδώ τον τύπο που
+ είναι ανάλογος της built in λίστας από ακεραίους. *)
+type my_int_list = EmptyList | IntList of int * my_int_list ;;
+let l = IntList (1, EmptyList) ;;
+
+
+(*** Ταίριασμα Προτύπων - Pattern Matching ***)
+
+(* Το ταίριασμα προτύπων είναι κάπως σαν το switch statement σε προστακτικές
+ γλώσσες προγραμματισμού, αλλά παρέχει πολύ μεγαλύτερη εκφραστική ισχύ.
+
+ Παρόλο που φαίνεται περίπλοκο, στην πραγματικότητα είναι απλώς ταίριασμα
+ ενός ορίσματος με μια συγκεκριμένη τιμή, ένα κατηγόρημα ή έναν type constructor
+ Το σύστημα τύπων είναι αυτό που το κάνει τόσο ισχυρό. *)
+
+(** Ταίριασμα με ακριβείς τιμές. **)
+
+let is_zero x =
+ match x with
+ | 0 -> true
+ | _ -> false (* Το "_" σημαίνει "οτιδήποτε άλλο". *)
+;;
+
+(* Εναλλακτικά μπορούμε να χρησιμοποιούμε το keyword "function". *)
+let is_one = function
+| 1 -> true
+| _ -> false
+;;
+
+(* Ταίριασμα με κατηγορήματα, γνωστό και ως "guarded pattern matching". *)
+let abs x =
+ match x with
+ | x when x < 0 -> -x
+ | _ -> x
+;;
+
+abs 5 ;; (* 5 *)
+abs (-5) ;; (* 5 πάλι *)
+
+(** Ταίριασμα με type constructors **)
+
+type animal = Dog of string | Cat of string ;;
+
+let say x =
+ match x with
+ | Dog x -> x ^ " says woof"
+ | Cat x -> x ^ " says meow"
+;;
+
+say (Cat "Fluffy") ;; (* "Fluffy says meow". *)
+
+(** Διάσχιση δομών δεδομένων με ταίριασμα προτύπων **)
+
+(* Οι αναδρομικοί τύποι μπορούν να διασχιστούν εύκολα με ταίριασμα προτύπων.
+ Ας δούμε πώς μπορούμε να διασχίσουμε μια λίστα.
+ Παρόλο που το built-in cons ("::") μοιάζει με infix τελεστή,
+ στην πραγματικότητα είναι ένας type constructor και μπορεί να
+ ταιριαστεί όπως όλοι οι type constructors. *)
+let rec sum_list l =
+ match l with
+ | [] -> 0
+ | head :: tail -> head + (sum_list tail)
+;;
+
+sum_list [1; 2; 3] ;; (* Αποτιμάται σε 6 *)
+
+(* Η built-in συνταξη των cons εμποδίζει τη δομή λίγο, γι αυτό θα φτιάξουμε
+ το δικό μας τύπο λίστας για την παρουσίαση. *)
+type int_list = Nil | Cons of int * int_list ;;
+let rec sum_int_list l =
+ match l with
+ | Nil -> 0
+ | Cons (head, tail) -> head + (sum_int_list tail)
+;;
+
+let t = Cons (1, Cons (2, Cons (3, Nil))) ;;
+sum_int_list t ;;
+```
+
+## Περισσότερα για την OCaml
+
+* Επισκεφθείτε την επίσημη σελίδα της OCaml για να κατεβάσετε τον compiler και να διαβάσετε το documentation: <http://ocaml.org/>
+* Δοκιμάστε διαδραστικά μαθήματα και έναν web-based interpreter από την OCaml Pro: <http://try.ocamlpro.com/>
diff --git a/el-gr/rust-gr.html.markdown b/el-gr/rust-gr.html.markdown
new file mode 100644
index 00000000..4da75b1d
--- /dev/null
+++ b/el-gr/rust-gr.html.markdown
@@ -0,0 +1,339 @@
+---
+language: Rust
+contributors:
+ - ["P1start", "http://p1start.github.io/"]
+ - ["Dimitri Kokkonis", "https://github.com/kokkonisd"]
+filename: learnrust-gr.rs
+lang: el-gr
+---
+
+_[ΣτΜ.: οι όροι "χαμηλό/υψηλό επίπεδο" αναφέρονται στην εγγύτητα μιας γλώσσας προγραμματισμού ή γενικότερα ενός
+στοιχείου στην "μηχανή", ή το υλικό του υπολογιστή. Για παράδειγμα, η φράση "η C είναι μια γλώσσα χαμηλού επιπέδου"
+αναφέρεται στο γεγονός ότι η C επιτρέπει άμεση και λεπτομερή διαχείρηση μνήμης, και πιο άμεσο έλεγχο του επεξεργαστή·
+σε καμία περίπτωση δεν σημαίνει ότι η C έχει λιγότερες δυνατότητες, και γενικότερα δεν φέρει αρνητική σημασία.]_
+
+Η Rust είναι μια γλώσσα προγραμματισμού ανεπτυγμένη από την Mozilla Research.
+Συνδυάζει τον έλεγχο της απόδοσης χαμηλού επιπέδου με διευκολύνσεις και ασφάλεια υψηλού επιπέδου.
+
+Πετυχαίνει αυτούς τους στόχους χωρίς να χρειάζεται garbage collector ή runtime, το οποίο καθιστά δυνατή τη χρήση
+βιβλιοθηκών της Rust ως αντικατάσταση της C.
+
+Η έκδοση 0.1 (η πρώτη της Rust) δημοσιεύθηκε τον Ιανουάριο του 2012, και για τα επόμενα 3 χρόνια η ανάπτυξή της
+εξελίχθηκε τόσο γρήγορα που, μέχρι πρότινος, προτείνονταν η χρήση μη-σταθερών εκδόσεων (nightly builds) αντί σταθερών
+εκδόσεων.
+
+Τις 15 Μαΐου 2015 δημοσιεύτηκε η εκδοχή 1.0 της Rust, με πλήρη εγγύηση συμβατότητας με προηγούμενες εκδοχές. Οι
+μη-σταθερές εκδόσεις συνήθως περιλαμβάνουν γρηγορότερους χρόνους μεταγλώττισης και γενικότερες βελτιώσεις όσον αφορά
+τον μεταγλωττιστή. Η μέθοδος [train release](https://www.plutora.com/blog/agile-release-train) χρησιμοποιείται, με
+συστηματικές εκδόσεις να δημοσιεύονται κάθε έξι εβδομάδες. Η beta έκδοση της Rust 1.1 δημοσιεύθηκε ταυτοχρόνως με την
+σταθερή έκδοση 1.0.
+
+Αν και η Rust είναι μια γλώσσα σχετικά χαμηλού επιπέδου, ο σχεδιασμός της περιλαμβάνει κάποιες έννοιες που συναντώνται
+συνχότερα σε γλώσσες υψηλού επιπέδου. Αυτό καθιστά την Rust γρήγορη και αποδοτική αλλά επίσης εύκολη και προσβάσιμη.
+
+
+```rust
+// Αυτό είναι ένα σχόλιο. Τα σχόλια μίας γραμμής γράφονται έτσι...
+// Και επεκτείνονται σε περισσότερες από μία γραμμές έτσι.
+
+/// Τα σχόλια documentation γράφονται έτσι, και υποστηρίζουν markdown.
+/// # Παράδειγμα
+///
+/// ```
+/// let five = 5
+/// ```
+
+//////////////////////
+// 1. Βασικές αρχές //
+//////////////////////
+
+#[allow(dead_code)]
+// Συναρτήσεις
+// `i32` είναι ο τύπος που αντιστοιχεί στους 32-bit signed ακέραιους
+fn add2(x: i32, y: i32) -> i32 {
+ // Έμεσα εννοούμενη επιστροφή του αποτελέσματος, χωρίς semicolon (;)
+ x + y
+}
+
+#[allow(unused_variables)]
+#[allow(unused_assignments)]
+#[allow(dead_code)]
+// Συνάρτηση main
+fn main() {
+ // Αριθμοί //
+
+ // Αμετάβλητη σύνδεση
+ let x: i32 = 1;
+
+ // Καταλήξεις integer/float
+ let y: i32 = 13i32;
+ let f: f64 = 1.3f64;
+
+ // Εξακρίβωση τύπου (type inference)
+ // Τις περισσότερες φορες ο μεταγλωττιστής της Rust μπορεί να εξακριβώσει τον τύπο μιας μεταβλητής, επομένως δεν
+ // χρειάζεται ο προγραμματιστής να τον δηλώνει ρητά.
+ // Σε αυτό το tutorial, οι τύποι δηλώνονται ρητά σε διάφορα σημεία, αλλά μόνο προκειμένου να είναι πιο ευανάγνωστος
+ // ο κώδικας. Ο μεταγλωττιστής μπορεί να το διαχειριστεί αυτόματα στις περισσότερες περιπτώσεις.
+ let implicit_x = 1;
+ let implicit_f = 1.3;
+
+ // Πράξεις
+ let sum = x + y + 13;
+
+ // Μη-αμετάβλητη αξία (με την έννοια ότι μπορεί να αλλάξει)
+ let mut mutable = 1;
+ mutable = 4;
+ mutable += 2;
+
+ // Αλφαριθμητικά //
+
+ // Σταθερά αλφαριθμητικά
+ let x: &str = "καλημέρα κόσμε!";
+
+ // Εκτύπωση αλφαριθμητικών
+ println!("{} {}", f, x); // 1.3 καλημέρα κόσμε!
+
+ // A `String` – a heap-allocated string
+ let s: String = "καλημέρα κόσμε".to_string();
+
+ // Ένα κομμάτι αλφαριθμητικού (string slice) – μια μη-μεταβλητή οπτική γωνία προς ένα άλλο αλφαριθμητικό
+ // Το αλφαριθμητικό μπορεί να είναι στατικό όπως τα σταθερά αλφαριθμητικά, ή να περιλαμβάνεται σε ένα άλλο,
+ // δυναμικό αντικείμενο (σε αυτή την περίπτωση τη μεταβλητή `s`)
+ let s_slice: &str = &s;
+
+ println!("{} {}", s, s_slice); // καλημέρα κόσμε καλημέρα κόσμε
+
+ // Διανύσματα/πίνακες //
+
+ // Πίνακας σταθερού μεγέθους
+ let four_ints: [i32; 4] = [1, 2, 3, 4];
+
+ // Δυναμικός πίνακας (διάνυσμα)
+ let mut vector: Vec<i32> = vec![1, 2, 3, 4];
+ vector.push(5);
+
+ // Ένα κομμάτι – μια μη-μεταβλητή οπτική γωνία προς ένα διάνυσμα ή πίνακα
+ // Είναι παρόμοιο με το κομμάτι αλφαριθμητικού που είδαμε προηγουμένως
+ let slice: &[i32] = &vector;
+
+ // Μπορούμε να χρησιμοποιήσουμε το `{:?}` για να εκτυπώσουμε κάτι σε στυλ debug
+ println!("{:?} {:?}", vector, slice); // [1, 2, 3, 4, 5] [1, 2, 3, 4, 5]
+
+ // Tuples (πλειάδες) //
+
+ // Ένα tuple είναι μια σταθερού μεγέθους σειρά από αξίες (πιθανά διαφορετικού τύπου)
+ let x: (i32, &str, f64) = (1, "καλημέρα", 3.4);
+
+ // Μπορούμε να χρησιμοποιήσουμε το `let` και ένα tuple για να δώσουμε πολλές αξίες σε πολλές μεταβλητές ταυτόχρονα
+ // (destructuring `let`)
+ let (a, b, c) = x;
+ println!("{} {} {}", a, b, c); // 1 καλημέρα 3.4
+
+ // Μπορούμε επίσης να επιλέξουμε ένα συγκεκριμένο στοιχείο από ένα tuple
+ println!("{}", x.1); // καλημέρα
+
+ //////////////
+ // 2. Τύποι //
+ //////////////
+
+ // Δομή
+ struct Point {
+ x: i32,
+ y: i32,
+ }
+
+ let origin: Point = Point { x: 0, y: 0 };
+
+ // Μια δομή με ανώνυμα πεδία, ή αλλιώς μια `δομή tuple` (`tuple struct`)
+ struct Point2(i32, i32);
+
+ let origin2 = Point2(0, 0);
+
+ // Enum, όπως στην C
+ enum Direction {
+ Left,
+ Right,
+ Up,
+ Down,
+ }
+
+ let up = Direction::Up;
+
+ // Enum με πεδία
+ enum OptionalI32 {
+ AnI32(i32),
+ Nothing,
+ }
+
+ let two: OptionalI32 = OptionalI32::AnI32(2);
+ let nothing = OptionalI32::Nothing;
+
+ // Γενικότητα (genericity) //
+
+ struct Foo<T> { bar: T }
+
+ // Αυτό ορίζεται στην standard library ως `Option`
+ enum Optional<T> {
+ SomeVal(T),
+ NoVal,
+ }
+
+ // Μέθοδοι //
+
+ impl<T> Foo<T> {
+ // Οι μέθοδοι παίρνουν πάντα μια ρητή παράμετρο `self`
+ fn bar(&self) -> &T { // Δανειζόμαστε το self
+ &self.bar
+ }
+ fn bar_mut(&mut self) -> &mut T { // Δανειζόμαστε το self ως μη-αμετάβλητη αξία
+ &mut self.bar
+ }
+ fn into_bar(self) -> T { // Εδώ το self καταναλώνεται
+ self.bar
+ }
+ }
+
+ let a_foo = Foo { bar: 1 };
+ println!("{}", a_foo.bar()); // 1
+
+ // Χαρακτηρηστικά (traits) (γνωστά ως interfaces ή typeclasses σε άλλες γλώσσες) //
+
+ trait Frobnicate<T> {
+ fn frobnicate(self) -> Option<T>;
+ }
+
+ impl<T> Frobnicate<T> for Foo<T> {
+ fn frobnicate(self) -> Option<T> {
+ Some(self.bar)
+ }
+ }
+
+ let another_foo = Foo { bar: 1 };
+ println!("{:?}", another_foo.frobnicate()); // Some(1)
+
+ //////////////////////////////////////////////////
+ // 3. Αντιστοιχίσεις Μοτίβων (Pattern Matching) //
+ //////////////////////////////////////////////////
+
+ let foo = OptionalI32::AnI32(1);
+ match foo {
+ OptionalI32::AnI32(n) => println!("Είναι ένα i32: {}", n),
+ OptionalI32::Nothing => println!("Δεν είναι τίποτα!"),
+ }
+
+ // Προχωρημένο pattern matching
+ struct FooBar { x: i32, y: OptionalI32 }
+ let bar = FooBar { x: 15, y: OptionalI32::AnI32(32) };
+
+ match bar {
+ FooBar { x: 0, y: OptionalI32::AnI32(0) } =>
+ println!("Οι αριθμοί είναι μηδέν!"),
+ FooBar { x: n, y: OptionalI32::AnI32(m) } if n == m =>
+ println!("Οι αριθμοί είναι οι ίδιοι"),
+ FooBar { x: n, y: OptionalI32::AnI32(m) } =>
+ println!("Διαφορετικοί αριθμοί: {} {}", n, m),
+ FooBar { x: _, y: OptionalI32::Nothing } =>
+ println!("Ο δεύτερος αριθμός δεν είναι τίποτα!"),
+ }
+
+ /////////////////////
+ // 4. Έλεγχος ροής //
+ /////////////////////
+
+ // Βρόγχοι `for`
+ let array = [1, 2, 3];
+ for i in array {
+ println!("{}", i);
+ }
+
+ // Διαστήματα
+ for i in 0u32..10 {
+ print!("{} ", i);
+ }
+ println!("");
+ // Τυπώνει `0 1 2 3 4 5 6 7 8 9 `
+
+ // Βρόγχοι `if`
+ if 1 == 1 {
+ println!("Τα μαθηματικά δουλεύουν!");
+ } else {
+ println!("Ωχ όχι...");
+ }
+
+ // `if` ως έκφραση
+ let value = if true {
+ "καλό"
+ } else {
+ "κακό"
+ };
+
+ // Βρόγχοι `while`
+ while 1 == 1 {
+ println!("Το σύμπαν λειτουργεί κανονικά.");
+ // Μπορούμε να βγούμε από το βρόγχο με το `break`
+ break
+ }
+
+ // Ατέρμονος βρόχγος
+ loop {
+ println!("Καλημέρα!");
+ // Μπορούμε να βγούμε από το βρόγχο με το `break`
+ break
+ }
+
+ //////////////////////////////////
+ // 5. Ασφάλεια μνήμης & δείκτες //
+ //////////////////////////////////
+
+ // Δείκτης με ιδιοκτήτη – μόνο ένα αντικείμενο μπορεί να είναι ο "ιδιοκτήτης" αυτού του δείκτη ανά πάσα στιγμή
+ // Αυτό σημαίνει ότι μόλις το `Box` βγει εκτός πλαισίου (out of scope), ο δείκτης μπορεί να ελευθερωθεί με ασφάλεια
+ let mut mine: Box<i32> = Box::new(3);
+ *mine = 5; // Dereference του δείκτη
+ // Εδώ, το `now_its_mine` γίνεται ιδιοκτήτης του `mine`. Δηλαδή, το `mine` μετακινείται.
+ let mut now_its_mine = mine;
+ *now_its_mine += 2;
+
+ println!("{}", now_its_mine); // 7
+ // println!("{}", mine); // Αυτό παράγει λάθος κατά τη μεταγλώττιση διότι τώρα ο δείκτης ανοίκει στο `now_its_mine`
+
+ // Reference (αναφορά) – ένας αμετάβλητος δείκτης που αναφέρεται σε άλλα δεδομένα
+ // Όταν μια αναφορά δίνεται σε μια αξία, λέμε πως η αξία έχει "δανειστεί".
+ // Όταν μια αξία δανείζεται αμετάβλητα, δεν μπορεί να είναι mutated (να μεταβληθεί) ή να μετακινηθεί.
+ // Ένας "δανεισμός" παραμένει ενεργός μέχρι την τελευταία χρήση της μεταβλητής που δανείζεται.
+ let mut var = 4;
+ var = 3;
+ let ref_var: &i32 = &var;
+
+ println!("{}", var); // Αντίθετα με το `mine` προηγουμένως, η μεταβλητή `var` μπορεί ακόμα να χρησιμοποιηθεί
+ println!("{}", *ref_var);
+ // var = 5; // Αυτό παράγει λάθος κατά τη μεταγλώττιση γιατί η μεταβλητή `var` είναι δανεισμένη
+ // *ref_var = 6; // Το ίδιο εδώ, γιατί η `ref_var` αποτελεί αμετάβλητη αναφορά
+ ref_var; // Εντολή no-op (τίποτα δεν εκτελείται από τον επεξεργαστή), η οποία όμως μετράει ως χρήση και κρατά τον
+ // "δανεισμό" ενεργό
+ var = 2; // Η `ref_var` δεν χρησιμοποιείται από εδώ και στο εξής, άρα ο "δανεισμός" τελειώνει
+
+ // Μεταβλητή αναφορά
+ // Όσο μια αξία είναι μεταβλητά δανεισμένη, παραμένει τελείως απροσβάσιμη.
+ let mut var2 = 4;
+ let ref_var2: &mut i32 = &mut var2;
+ *ref_var2 += 2; // Ο αστερίσκος (*) χρησιμοποιείται ως δείκτης προς την μεταβλητά δανεισμένη `var2`
+
+ println!("{}", *ref_var2); // 6 , // Αν είχαμε `var2` εδώ θα προκαλούνταν λάθος μεταγλώττισης.
+ // O τύπος της `ref_var2` είναι &mut i32, άρα αποθηκεύει μια αναφορά προς μια αξία i32, όχι την αξία την ίδια.
+ // var2 = 2; // Λάθος μεταγλώττισης, γιατί η `var2` είναι δανεισμένη.
+ ref_var2; // Εντολή no-op (τίποτα δεν εκτελείται από τον επεξεργαστή), η οποία όμως μετράει ως χρήση και κρατά τον
+ // "δανεισμό" ενεργό
+}
+```
+
+## Μάθετε περισσότερα
+
+Υπάρχουν πολλά ακόμα πράγματα να μάθει κανείς· αυτά είναι μόνο τα βασικά της Rust, που επιτρέπουν να καταλάβουμε το
+βασικό τρόπο λειτουργίας της. Για να μάθετε περισσότερα για τη Rust, διαβάστε το [The Rust Programming
+Language](http://doc.rust-lang.org/book/index.html) και επισκεφθείτε το subreddit [/r/rust](http://reddit.com/r/rust).
+Οι άνθρωποι πίσω από το κανάλι #rust στο irc.mozilla.org είναι επίσης πάντα πρόθυμοι να βοηθήσουν τους αρχάριους.
+
+Μπορείτε επίσης να παίξετε με τη Rust χρησιμοποιώντας τους εξής online μεταγλωττιστές:
+
+- [Rust playpen](http://play.rust-lang.org)
+- [Rust website](http://rust-lang.org)
diff --git a/el-gr/vim-gr.html.markdown b/el-gr/vim-gr.html.markdown
index 679a5488..b11b5c33 100644
--- a/el-gr/vim-gr.html.markdown
+++ b/el-gr/vim-gr.html.markdown
@@ -3,7 +3,7 @@ category: tool
tool: vim
contributors:
- ["RadhikaG", "https://github.com/RadhikaG"]
-filename: LearnVim.txt
+filename: LearnVim-gr.txt
lang: el-gr
---