vaggouras Δημοσ. 8 Μαΐου 2010 Δημοσ. 8 Μαΐου 2010 Καλησπερα, κανω ενα project για τη σχολη σε lisp κι εχω το εξης προβλημα. Πραγματικα ότι και να κανω, η συναρτηση που φτιαχνω μου αλλαζει κατα την εκτελεση της τα ορισματα εισοδου..! Δηλαδη, με οποιονδηποτε τροπο κι αν εχω αντιγραψει την μεταβλητη εισοδου σε καποια τοπικη μεταβλητη μεσα στην συναρτηση, αλλαζοντας την τοπικη μεταβλητη, αλλαζει και η μεταβλητη εισοδου.. Εχει κανεις τιποτα υπ οψη του???
vaggouras Δημοσ. 8 Μαΐου 2010 Μέλος Δημοσ. 8 Μαΐου 2010 (defun makeMove (lista a (let ((s nil) (problem nil)) (setf problem (fourth lista)) (setf s (pop (nth (- a 1) problem))) (push s (nth (- b 1) problem)) (setf (fourth lista) problem))) Αυτη ειναι μια απ τις συναρτησεις. Ακομα κι αν θεσω τη lista σε μια αλλη μεταβλητη, και δεν ξαναδιαβασω κατι απ τη lista, συνεχιζει και αλλαζει.. (defun makeMove (lista a (let ((newList nil)(s nil) (problem nil)) (setf newList lista) (setf problem (fourth newList)) (setf s (pop (nth (- a 1) problem))) (push s (nth (- b 1) problem)) (setf (fourth newList) problem))) Επισης, εχω δοκιμασει να αντικαταστησω το (setf newList lista) με το (setf newList (append lista ())) αλλα το προβλημα παραμενει..
C6WGMN Δημοσ. 8 Μαΐου 2010 Δημοσ. 8 Μαΐου 2010 Χρησιμοποιείς την POP που είναι καταστροφική συνάρτηση (δηλαδή αλλάζει την λίστα). Στην ουσία αλλάζεις την λίστα (fourth lista), οπότε αλλάζει και η lista. Συμβουλή: μην ονομάζεις την λίστα lista αλλά list. Γενικά αποφυγή greeklish όρων... είτε στα ελληνικά είτε στα αγγλικά (με κατάλληλο setup η lisp υποστιρίζει UTF-8). Ακόμα, μην χρησιμοποιείς CamelCase http://en.wikipedia.org/wiki/CamelCase#Current_usage_in_computing ούτε Hungarian notation http://en.wikipedia.org/wiki/Hungarian_notation. Καλύτερο όνομα είναι make-move Γενικά ο κώδικας σου είναι άσχημος διότι παραπέμπει σε δομημένο προγραμματισμό. Παρατειρώ ότι θέτεις τις μεταβλητές σε nil και ύστερα δίνεις μια τιμή με την SETF. Μπορείς απλά να δηλώσεις τα ονόματα των μεταβλητών στην LET αν δεν βάλεις δεύτερη παρένθεση. Δηλαδή: (let (a (setf a 1 b 2) (+ a ) Να πω την αλήθεια δεν έχω ιδέα τι προσπαθεί να κάνει ο κώδικας διότι επειδή δεν είναι προφανές. Μπορείς να δώσεις ένα παράδειγμα για το πως υποτείθεται ότι χρησιμοποιείται? Αλλά τέλος πάντων μπορείς να χρησιμοποιείσεις τις συναρτήσεις COPY-LIST και COPY-TREE για να δημιουργίσεις <<κόπιες>> της αρχικής λίστας (η διαφορά των δύο είναι ότι η COPY-LIST αντιγράφει μόνο τα πρώτα CONS ενώ η COPY-TREE αντιγράφει όλα τα αντικείμενα (shallow/deep copy), οπότε εσύ μάλλον την COPY-TREE θες)
vaggouras Δημοσ. 8 Μαΐου 2010 Μέλος Δημοσ. 8 Μαΐου 2010 Κατ αρχην σ ευχαριστω πολυ για τη βοηθεια.. Ημουν σιγουρος οτι καποιος θα εκανε καποια παρατηρηση για τον κωδικα καθως αρχισα πριν 4 μερες να ασχολουμαι με τη Lisp.. Και οσον αφορα αυτον, ποιες αλλες συναρτησεις μπορω να χρησιμοποιησω και να κανουν την ιδια δουλεια;; Η τουλαχιστον δεν υπαρχει τροπος να κανω ενα αντιγραφο του ορισματος, ετσι ωστε να μη συνδεεται το αντιγραφο με το ορισμα, οπως μου συμβαινει στην δευτερη εκδοχη της συναρτησης;; Το project γενικα εχει να κανει με πυργους ανοι.. Και η συναρτηση δεχεται μια λιστα της μορφης '(α β γ ( (1 3 4 5 6) ( 2) (7 8) )))......οπου οπως φαινεται το τεταρτο στοιχειο ειναι μια λιστα που περιεχει λιστες που αναπαριστουν ποιοι δισκοι βρισκονται σε καθε πασαλο. Το ζητουμενο ειναι η συναρτηση να "μεταφερει" δισκους απο τον ενα πασαλο στον αλλο.. Για παραδειγμα, αν στην παραπανω λιστα εστω lista εφαρμοσω το (makemove lista 1 2) τοτε θα επιστραφει (α β γ ( (3 4 5 6) (1 2) (7 8) )))
C6WGMN Δημοσ. 8 Μαΐου 2010 Δημοσ. 8 Μαΐου 2010 Δοκίμασε αυτό > (defun make-move (list a (let ((list (fourth list))) (push (pop (nth a list)) (nth b list))) list) Η LET δεν είναι αναγκαία, απλά για να μην γράφω δύο φορές (fourth list). Επείσης παρατείρησε ότι το όνομα στην καινούργια μεταβλητή είναι το ίδιο με την παλιά, οπότε σε όλο το σκέλος της LET με το όνομα list αναφέρεσε μόνο στο τέταρτο στοιχείο της αρχικής list (έτσι και αλλιώς μόνο με αυτό ασχολείσε). Αυτό ονομάζεται lexical scope. Η common lisp υποστιρίζει και dynamic scope, με DECLARE, DEFPARAMETER, DEFVAR. Η διαφορά dynamic με lexical scope είναι πως η πρώτη έχει μια στοίβα από τιμές και κάθε αναφορά στο όνομα της μεταβλητής δίνει μια από αυτές τις τιμές ανεξάρτητα από ποιό μέρος του κώδικα καλείται. Για παράδειγμα: > CL-USER> (defun f () (print x)) ; in: LAMBDA NIL ; (PRINT X) ; ; caught WARNING: ; undefined variable: X ; ; compilation unit finished ; Undefined variable: ; X ; caught 1 WARNING condition STYLE-WARNING: redefining F in DEFUN F CL-USER> (let ((x 1)) (declare (special x)) (f)) 1 Όπως βλέπεις η f <<διαβάζει>> την τιμή της Χ ως 1 επειδή η Χ είναι dynamic (σε κουτσή στραβή ορολογία). Τα αναφέρω έτσι αν υπάρχει ενδιαφέρον δεν είναι χρήσιμα στο συγκεκριμένο πρόβλημα που επιλύεις. Στο πρόβλημα σου: > CL-USER> (defparameter *list* (copy-tree '(a b c ((3 4 5 6) (1 2) (7 8))))) *LIST* CL-USER> *list* (A B C ((3 4 5 6) (1 2) (7 8))) CL-USER> (make-move *list* 0 1) (A B C ((4 5 6) (3 1 2) (7 8))) CL-USER> *list* (A B C ((4 5 6) (3 1 2) (7 8))) CL-USER> Χρησιμοποιώ την COPY-TREE διότι ο QUOTE operator (το <<αυτάκι>> '), είναι constant, με άλλα λόγια κάτι σαν τα literal strings, π.χ. "Hello world" στην C, και δεν μπορείς να δουλέψεις με POP και PUSH που είναι destructive. Υπάρχουν και άλλες λύσεις για παράδειγμα να μην αλλάζεις την λίστα αλλά να δημιουργείς μία καινουργία ωστόσο δεν βλέπω τον λόγο στο παράδειγμα σου για κάτι τέτοιο. Τέλος, προτιμώ 0 ώς το πρώτο στοιχείο της λίστας και όχι 1. Αποφεύγεις να γράφεις (- a 1) έτσι και εκτός από αυτό τεριάζει με την υπόλοιπη φιλοσοφία των συναρτήσεων στην common lisp, όπως πχ της NTH. edit: αντί να χρησιμοποιείς την λίστα μπορείς να χρησιμοποιείσεις και το DEFSTRUCT για την κατασκευή κατάλληλων κλάσεων για τέτοια αντικείμενα (α, β, γ, και μια λίστα): > CL-USER> (defstruct my-object (a) ( (c) (list)) MY-OBJECT CL-USER> (make-my-object :a 1 :b 2 :c 3 :list (copy-tree '((1 2 3) (5 6 7)))) #S(MY-OBJECT :A 1 :B 2 :C 3 :LIST ((1 2 3) (5 6 7))) CL-USER> (my-object-list *) ((1 2 3) (5 6 7)) Σε περίπτωση που δεν το γνωρίζεις, ο αστερίσκος αντικαταστάται από την προηγούμενη τιμή που υπολογίστικε από τον listener. Γενικά η DEFSTRUCT μοιάζει με τα struct σε C και κάνει τα εξής: 1) Κατασκευάζει την κλάση του αντικειμένου 2) Ορίζει μια συνάρτηση με το όνομα MAKE-X όπου Χ το όνομα της κλάσης, για να δημιουργείς αντικείμενα της κλάσης αυτής 3) Ορίζει συναρτήσεις "accessors" ώστε να μπορείς να προσπελάσεις τα μέλη. Το όνομα του κάθε accessor είναι X-Y όπου Υ το όνομα του μέλους της κλάσης Χ. Α, και κάτι άλλο που βρήκα! Με βάση τον κώδικα στην σελίδα αυτή, http://hanoitower.mkolar.org/shortestTHalgo.html το πρόβλημα λίνεται πολύ απλά: > (defun solve-hannoi (n) "Solve the hannoi problem of n disks with 3 poles" (dotimes (x (1- (expt 2 n))) (format t "Move from pole ~D to pole ~D.~%" (rem (logand x (1+ x)) 3) (rem (1+ (logior x (1+ x))) 3)))) Δες τον κώδικα να δουλεύει (μην με ρωτίσεις γιατί ο αλγόριθμος είναι σωστός, δεν γνωρίζω): > CL-USER> (solve-hannoi 3) Move from pole 0 to pole 2. Move from pole 0 to pole 1. Move from pole 2 to pole 1. Move from pole 0 to pole 2. Move from pole 1 to pole 0. Move from pole 1 to pole 2. Move from pole 0 to pole 2. NIL
vaggouras Δημοσ. 8 Μαΐου 2010 Μέλος Δημοσ. 8 Μαΐου 2010 Μην πεις τιποτ αλλο.. Εισαι θεος.. Μ εσωσες.. Βασικα το copy-tree εκανε ολη τη δουλεια, απλα πριν που ποσταρα δεν το ειχα χρησιμοποιησει σωστα οποτε ειχα παλι προβλημα.. Λοιπον να σε καλα κι ευχαριστω!
absolute1 Δημοσ. 19 Οκτωβρίου 2010 Δημοσ. 19 Οκτωβρίου 2010 Γεια σας, Θα ήθελα πραγματικά την βοήθεια σας σε ένα ζήτημα που έχω. Θέλω να ρωτήσω αν γνωρίζει κανείς: 1. Σε ποια γλώσσα είναι γραμμένο το πρόγραμμα στο τέλος (εννοείται ότι το πρόγραμμα δεν είναι ολόκληρο). 2. Που μπορώ να βρω την θεωρία για αυτή την γλώσσα. Υπάρχει κάποιο σχετικό site ή βιβλίο(στα ελληνικά αν είναι δυνατό); Εγώ γνωρίζω ότι είναι ένας κώδικα με τον οποίο μπορώ να δημιουργήσω drop-down menu. Μακάρι να βρεθεί κάποιος που να γνωρίζει γιατί έψαξα σε δεκάδες βιβλιοπωλεία και δεν βρήκα κάτι σχετικό. ***MENUGROUP=TestProgram ***POP1 [NewAuto] [Auto1]$I=TestProgram.Auto1 $I=* ***IMAGE **Auto1 [Aut1] [circle,circle1]^C^C-INSERT circle;scale;1; [square,square1]^C^C-INSERT square;scale;1;
absolute1 Δημοσ. 19 Οκτωβρίου 2010 Δημοσ. 19 Οκτωβρίου 2010 Γεια σας, Θα ήθελα πραγματικά την βοήθεια σας σε ένα ζήτημα που έχω. Θέλω να ρωτήσω αν γνωρίζει κανείς: 1. Σε ποια γλώσσα είναι γραμμένο το πρόγραμμα στο τέλος (εννοείται ότι το πρόγραμμα δεν είναι ολόκληρο). 2. Που μπορώ να βρω την θεωρία για αυτή την γλώσσα. Υπάρχει κάποιο σχετικό site ή βιβλίο(στα ελληνικά αν είναι δυνατό); Εγώ γνωρίζω ότι είναι ένας κώδικα με τον οποίο μπορώ να δημιουργήσω drop-down menu. Μακάρι να βρεθεί κάποιος που να γνωρίζει γιατί έψαξα σε δεκάδες βιβλιοπωλεία και δεν βρήκα κάτι σχετικό. ***MENUGROUP=TestProgram ***POP1 [NewAuto] [Auto1]$I=TestProgram.Auto1 $I=* ***IMAGE **Auto1 [Aut1] [circle,circle1]^C^C-INSERT circle;scale;1; [square,square1]^C^C-INSERT square;scale;1;
virxen75 Δημοσ. 19 Οκτωβρίου 2010 Δημοσ. 19 Οκτωβρίου 2010 προσωπικά μου μοιάζει για μενού file του Autocad
virxen75 Δημοσ. 19 Οκτωβρίου 2010 Δημοσ. 19 Οκτωβρίου 2010 προσωπικά μου μοιάζει για μενού file του Autocad
gtroza Δημοσ. 20 Οκτωβρίου 2010 Δημοσ. 20 Οκτωβρίου 2010 μάλλον μενού του Autocad είναι με σειρά εντολών του http://www.brighthub.com/engineering/mechanical/articles/25421.aspx δες και autolisp http://www.brighthub.com/engineering/mechanical/articles/15773.aspx http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%202010%20User%20Documentation/index.html?url=WS73099cc142f4875513fb5cd10c4aa30d6b-7c9a.htm,topicNumber=d0e383477 βρές κανένα παλιό βιβλίο του Omura για autocad υπάρχει στα ελληνικά προφανώς και άλλα πιό σύγχρονα για menu http://www.caddigest.com/subjects/autocad/tutorials/select/parsai_mouse_buttons.htm και άλλα διάφορα http://www.caddigest.com/subjects/autocad/tutorials/select/index.htm .
gtroza Δημοσ. 20 Οκτωβρίου 2010 Δημοσ. 20 Οκτωβρίου 2010 μάλλον μενού του Autocad είναι με σειρά εντολών του http://www.brighthub.com/engineering/mechanical/articles/25421.aspx δες και autolisp http://www.brighthub.com/engineering/mechanical/articles/15773.aspx http://docs.autodesk.com/ACD/2010/ENU/AutoCAD%202010%20User%20Documentation/index.html?url=WS73099cc142f4875513fb5cd10c4aa30d6b-7c9a.htm,topicNumber=d0e383477 βρές κανένα παλιό βιβλίο του Omura για autocad υπάρχει στα ελληνικά προφανώς και άλλα πιό σύγχρονα για menu http://www.caddigest.com/subjects/autocad/tutorials/select/parsai_mouse_buttons.htm και άλλα διάφορα http://www.caddigest.com/subjects/autocad/tutorials/select/index.htm .
absolute1 Δημοσ. 20 Οκτωβρίου 2010 Δημοσ. 20 Οκτωβρίου 2010 Ευχαριστώ πολύ για την βοήθεια σας. Δεν θέλω να ασχοληθώ σε όλο το εύρος της Autolisp, απλά μόνο και μόνο για την σύνταξη menu files και τα macro.. Αν έχετε κάτι σχετικό στα ελληνικά ή οτίδήποτε πιο συγκεκριμένο πάνω στο θέμα, σας παρακαλώ αν είναι να σας στείλω το mail μου για να μου το στείλεται. Αν έχετε κάποιο βιβλίο για παράδειγμα μπορείτε να μου σκανάρετε την σελίδα και να μου την στείλετε.
absolute1 Δημοσ. 20 Οκτωβρίου 2010 Δημοσ. 20 Οκτωβρίου 2010 Ευχαριστώ πολύ για την βοήθεια σας. Δεν θέλω να ασχοληθώ σε όλο το εύρος της Autolisp, απλά μόνο και μόνο για την σύνταξη menu files και τα macro.. Αν έχετε κάτι σχετικό στα ελληνικά ή οτίδήποτε πιο συγκεκριμένο πάνω στο θέμα, σας παρακαλώ αν είναι να σας στείλω το mail μου για να μου το στείλεται. Αν έχετε κάποιο βιβλίο για παράδειγμα μπορείτε να μου σκανάρετε την σελίδα και να μου την στείλετε.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.