DedSec Project

wren — συγκεντρωτικός οδηγός — DedSec Project

wren — συγκεντρωτικός οδηγός Wren Τι προσφέρει η γλώσσα Η Wren είναι μικρή αντικειμενοστραφής γλώσσα ενσωμάτωσης σε εφαρμογές. Ο host καθορίζει modules και τον τρόπο εκτέλεσης του κώδικα…

Wren

Τι προσφέρει η γλώσσα

Η Wren είναι μικρή αντικειμενοστραφής γλώσσα ενσωμάτωσης σε εφαρμογές. Ο host καθορίζει modules και τον τρόπο εκτέλεσης του κώδικα.

Μικρό παράδειγμα προς μελέτη

class Counter {
  construct new(n) { _n = n }
  value { _n }
}
System.print(Counter.new(4).value)

Κατασκεύασε μετρητές με διαφορετικές αρχικές τιμές. Ξεχώρισε getter από μέθοδο όταν διαβάζεις την τιμή.

Τι να επαληθεύσεις

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

Παγίδα ειδική για το θέμα

Πολλές υλοποιήσεις Wren είναι ενσωματωμένες σε άλλη εφαρμογή· έλεγξε ποια API παρέχει ο host.

Εργαστήριο εξάσκησης: Wren

Counter με ξεκάθαρο αμετάβλητο

Η Wren είναι δυναμική γλώσσα scripting με classes. Σε προσωρινό πρόγραμμα γράψε:

class Counter {
  construct new() { _count = 0 }
  increment() { _count = _count + 1 }
  value { _count }
}
var c = Counter.new()
c.increment()
c.increment()
System.print(c.value)

Αναμένεται 2. Το αρχικό underscore δηλώνει instance field και η value είναι getter. Το νέο αντικείμενο ξεκινά στο μηδέν και αυξάνεται μόνο με increment. Δοκίμασε στον προβλεπόμενο Wren interpreter και σημείωσε πραγματική έξοδο και έκδοση· εδώ δεν έγινε εκτέλεση ειδικού runtime.

Ανεξαρτησία instances

Δημιούργησε δύο counters και αύξησε μόνο τον πρώτο. Πρόβλεψε τιμές 1 και 0 αντίστοιχα. Η άσκηση ελέγχει ότι κάθε αντικείμενο έχει δικό του instance field· δεν αποδεικνύει ασφάλεια ταυτόχρονης πρόσβασης ή ανθεκτική αποθήκευση. Περιέγραψε πώς θα άλλαζε η συμπεριφορά αν υπήρχε κοινή κατάσταση αλλού.

Αποτυχία με άγνωστο method

Σε χωριστό αντίγραφο κάλεσε μέθοδο που δεν ορίζεται στην Counter. Κατέγραψε πραγματικό runtime error. Η Wren δεν απορρίπτει κάθε άγνωστο message με στατικό έλεγχο τύπων πριν την εκτέλεση. Διαχώρισε τη μέθοδο που λείπει από έγκυρη μέθοδο η οποία υπολογίζει λανθασμένο αριθμό.

Αυτόνομο εργαστήριο

Πρόσθεσε add(n) με πολιτική απόρριψης αρνητικών εισόδων. Δοκίμασε μηδέν, θετικό, αρνητικό και πολλές κλήσεις. Δημιούργησε reset() και όρισε αν επιτρέπεται να μηδενίζει ήδη δημοσιευμένο σκορ. Κατάγραψε αναλλοίωτο κανόνα και πραγματική έκδοση Wren χωρίς να μεταφέρεις άκριτα υποθέσεις Python ή Lua. Πηγή: https://wren.io/

Wren — Διαδρομή ουσιαστικής εξάσκησης

Πλαίσιο

Η Wren είναι μικρή γλώσσα για embedded scripting, όχι Python package ή JavaScript engine. Θα φτιάξεις class που προστατεύει την ποσότητα προϊόντος και απορρίπτει άκυρες πωλήσεις. Η άσκηση δουλεύει μόνο με δεδομένα μνήμης, χωρίς πρόσβαση σε αρχεία.

Κώδικας (stock.wren)

class Stock {
  construct new(quantity) {
    _quantity = quantity
  }

  quantity { return _quantity }

  sell(amount) {
    if (amount <= 0 || amount > _quantity) {
      Fiber.abort("invalid sale")
    }
    _quantity = _quantity - amount
  }
}

var stock = Stock.new(5)
stock.sell(2)
System.print(stock.quantity)

Η κανονική έξοδος αναμένεται 3. Το πεδίο _quantity ανήκει στο instance, ενώ το quantity getter είναι προσβάσιμο εξωτερικά. Ο constructor θέτει την αρχική τιμή και η sell ενημερώνει την κατάσταση αφού κάνει έλεγχο. Για πραγματική εφαρμογή πρέπει να ελεγχθεί και ο constructor: εδώ επιτρέπεται σκόπιμα μη έγκυρη αρχική τιμή για το επόμενο πείραμα.

Δοκιμές και αρνητικές περιπτώσεις

  1. Εκτέλεσε sell(0) ξεχωριστά: πρέπει να εμφανιστεί invalid sale και να μην αφαιρεθεί ποσότητα.
  2. Σε καινούριο Stock.new(5) δοκίμασε sell(9). Η αποτυχία προηγείται της αφαίρεσης.
  3. Πρόσθεσε απόρριψη αρνητικής αρχικής ποσότητας και έλεγξε και το μηδέν.
  4. Χρησιμοποίησε κατάλληλο Fiber.try σε ελεγχόμενη αποτυχία για να ξεχωρίσεις χειρισμένο σφάλμα από termination του κύριου fiber.
  5. Αποφάσισε αν επιτρέπονται δεκαδικές πωλήσεις: οι αριθμοί της Wren δεν περιορίζονται αυτόματα σε ακέραιες μονάδες.

Τεκμήρια

Κατάγραψε έκδοση Wren, τρόπο εκκίνησης, έξοδο και σφάλματα από χωριστές δοκιμές. Η Wren δεν χρησιμοποιεί γενικό try/catch· τα errors διαχειρίζονται μέσω fibers. Αναφορά: https://wren.io/error-handling.html