Grafikus tervezőrendszerek programozása 2. előadás AutoLisp alapelemek (ismétlés) • Alapelemek: – Listák – Atomok • Konstans atomok • Szimbólikus atomok – Speciális atomok nil, t.

Download Report

Transcript Grafikus tervezőrendszerek programozása 2. előadás AutoLisp alapelemek (ismétlés) • Alapelemek: – Listák – Atomok • Konstans atomok • Szimbólikus atomok – Speciális atomok nil, t.

Grafikus tervezőrendszerek
programozása
2. előadás
AutoLisp alapelemek (ismétlés)
• Alapelemek:
– Listák
– Atomok
• Konstans atomok
• Szimbólikus atomok
– Speciális atomok
nil, t
Lisp interpreter (ismétlés)
• Interaktív végrehajtás
• Lisp végrehajtási ciklus: read-eval-print
– Beolvassa a „programot” (file vagy gépelt)
– Kiértékeli
– Az eredményt kinyomtatja
Kiértékelés sorrendje (ismétlés)
• Konstans atom értéke: maga az atom
• Szimbólikus atom értéke: a szimbólumhoz
rendelt értéke
• Lista esetén:
–
–
–
–
Az első elem a listában egy függvény neve
A többi elem az argumentumokat jelenti
Függvény lista is lehet argumentum
Általános alak:
(függvény1 arg1 ... (függvény2 arga) ...)
Listák
• A lista elemeit el kell érni, ehhez a listát
részekre kell szedni
– Megkülönböztetjük a lista első elemét (fejét) és
maradékát
• A lista feje is egy S-kifejezés, így atom
vagy lista
• A lista maradéka „mindig lista”
Lista példa
• (ez egy lista)
– Lista feje: ez
– Lista maradéka: (egy lista)
• ((elso elem)(masodik elem)(harmadik))
– Lista feje: (elso elem)
– Lista maradéka:((masodik elem)(harmadik))
• (egy-elem)
– Lista feje: egy-elem
– Lista maradéka: () vagy üres lista
Lista példa
• Üres lista: () vagy nil
• Nem üres lista: (nil)
– Lista feje: nil
– Lista maradéka !!!: () vagy nil
Pontozott párok
• Szükség lehet olyan listára, amelynek a
maradéka nem lista
• Két S-kifejezés, közöttük egy pont
• (fej . maradek)
– Lista feje: fej
– Lista maradéka !!!: maradek
Pontozott párok
• Maradék is lehet S-kifejezés
• (fej . (pont utani lista))
– Lista feje: fej
– Lista maradéka: (pont utani lista)
• Ami egyenértékű a következővel
• (fej (pont utani lista))
– Lista feje: fej
– Lista maradéka: (pont utani lista)
Pontozott párok
• Minden lista egyben pontozott pár is
(fej . (pont . (utani . (lista . nil))))
• De általában nem ezt a jelölést hanem a
hagyományos jelölést használjuk
(fej pont utani lista . nil)
Listák reprezentálása 1.
•
•
•
•
Listák reprezentálhatók bináris faként
Bináris fa levelei az atomok
Bináris csomópontok (Kétfelé ágaznak el)
Egyszerű példa: (a b)
Listák reprezentálása 2.
• Csomóponttól bal és jobb oldali ág indul
– Bal oldali ág lekérdezése: car
– Jobb oldali ág lekérdezése: cdr (mindig listát ad vissza !!!)
• Az „utolsó” atom egy üres lista vagy nil
– Egyszerű példa: (a b)
(car
‘(a b))
(cdr
‘(a b))
(car (cdr ‘(a b)))
= a
= (b)
= b
(cdr (cdr ‘(a b)))
= nil
Listák reprezentálása 3.
( (a b) (c d) )
(car ...)
= (a b)
(car (car ...)) = a
(cdr ...)
= ((c d))
(car (cdr ...)) = (c d)
( () () )
Listák létrehozása
• Kifejezések sorozatából lista: list
(list ‘a ‘b ‘c)
=
(a b c)
• Két kifejezésből lista: cons (construct)
(cons ‘a ())
=
(a)
(cons ‘a (cons ‘b (cons ‘c ())))
=
(a b c)
(cons ‘a ‘(b c))
=
(a b c)
Pontozott párok 1.
• Második argumentum is atom !
(cons ‘a ‘b)
= (a . b)
(car ‘(a . b)) = a
(cdr ‘(a . b)) = b
(list ‘a ‘b) = (a b)
(car ‘(a b)) = a
(cdr ‘(a b)) = (b)
Pontozott párok 2.
(cons ‘a (cons ‘b ‘c)) = (a b . c)
Pont utáni rész a lista cdr része
(a . (b . c))
(a . (b . (c . nil)))
(a b c)
Listakezelő függvények 1.
• car és cdr függvények kombinációja:
– cadr, cddr, caar, cdar
– caaar, caadr, caddr, cdddr
• Utolsó elem elérése
(last ‘(a b c))
= c
• Lista n-edik elemének elérése
(nth 2 ‘(0 1 2))
(nth 0 ‘(a b c))
=
=
2
a
Listakezelő függvények 2.
• Elemek sorrendjének megváltoztatása
(reverse ‘(a b c))
(reverse ‘(1 2 (3)))
=
=
(c b a)
((3) 2 1)
=
(m a m a)
=
=
3
0
• Listák összefűzése
(append ‘(m a) ‘(m a))
• Lista hossza
(length ‘(1 2 3))
(length ‘())
• Elem kicserélése
(subst ‘l ‘k ‘((m a) k i) ) =
((m a) l i)
Függvények definíciója
(defun szimbólum (arg1 arg2 ... / arg3 ...)
kifejezések
...
)
– a függvény neve
arg1, arg2, ... – a függvény argumentumai
arg3 ... – lokális változók
kifejezések – a függvény végrehajtása során
értékelődnek ki
– szimbólum
–
–
–
Függvény visszatérési értéke
• Minden függvénynek van visszatérési
értéke !
– C programozási nyelvben van void típus, itt
nincs.
– Legfeljebb nem vesszük figyelembe a
visszaadott értéket.
• A visszatérési érték az utolsó kifejezés
értéke !
Függvény példa
Visszatérési
érték:
(defun add23 (x)
(+ 23 x)
)
(add23 32)
(add23 4.0)
=
=
=
add23
55
27.00000
(defun masodik (x)
(car (cdr x))
)
(masodik ‘(1 2 3))
=
=
masodik
2
Függvény neve
• A függvények neve írja le, hogy mit csinál a
függvény:
– Jó: rajz_negyszog,
doboz
– Rossz: xxzedsf, int34
• Beépített függvény nevét ne használjuk,
mert így a beépített függvény nem lesz
többé használható.
Bonyolultabb példa
• Egy mozi tulajdonosa szeretné megállapítani a
jegyek árát.
• Minnél drágább a jegy annál kevesebb a
látogató a moziban.
• Több előadás alapján sikerült megállapítania
egy kapcsolatot a jegy ára és a résztvevők
száma között.
Összefüggések
• 5 dolláros jegy árnál 210 ember néz meg
egy filmet.
• Ha csökkenti az árat 10 centtel, akkor 15-el
több ember jön el. (De több ember több
költséggel jár.)
• Minden előadás 180 dollárba kerül (film
ára).
• Minden látogató 4 centbe kerül ezen felül.
Kérdések
• A mozi tulajdonosa szeretné megtudni,
hogy milyen kapcsolat van a profit és a jegy
ára között, ill. milyen jegy árnál kereshet a
legtöbbet.
Kapcsolatok
• profit = bevétel – költség
• bevétel = látogatók száma * jegy ára
– Látogatók száma a jegy árától függ:
• 210 ember 5$ -os áron
• Ezen felül
(eltérés)
0.10$
5$ – ár
x = …
15 ember
x
• költség = 180$ + 0.04$ * látogatók száma
Program 1.
(defun profit (price)
(- (* (+ 210
(* (/ 15 0.10) (- 5.00 price)))
price)
(+ 180
(* 0.04
(+ 210
(* (/ 15 0.10)
(- 5.00 price)))))))
Program 2.
(defun profit (ár)
(- (bevétel ár) (kiadás ár))
)
(defun bevétel (ár)
(* (résztvevők ár) ár)
)
(defun kiadás (ár)
(+ 180 (* 0.04 (résztvevők ár)))
)
(defun résztvevők (ár)
(+ 210 (* (/ 15 0.10) (- 5.00 ár)))
)
Értékadás, változók
• (setq szimbólum kifejezés)
• Beállítja a szimbólumot / változót a
második argumentum / kifejezés
kiértékelésének eredményére
• Például:
–
–
–
–
–
(setq radius 2.3)
radius
(setq lista ‘(1 2))
(setq szam (+ 2 radius))
(setq a 1.2 b 3.4)
=
=
=
=
=
2.3
2.3
(1 2)
4.3
3.4
Változók típusa
• A változóknak nincs előredefiniált típusa
• Bármilyen típusú lehet (szám, szöveg, lista, ...)
• Típusát menet közben is változtathatja!!!
Változó értéke
(setq radius 2.3)
=
2.3
(setq radius “aa”)
=
“aa”
(setq radius ‘(1 2 3)) =
(1 2 3)
Változók neve
• A változók neve írja le, hogy mit tartalmaz:
– Jó: kezdopont,
hossz
– Rossz: tt, val34
• Beépített függvény vagy változó nevét ne
használjuk, mert így a beépített függvény
vagy változó eredeti értéke nem lesz többé
használható.
• Például ne definiáljuk: nil, car, cdr
Változók használata
• Egy változót csak egy dologra használjunk
• Próbáljuk elkerülni a globális változók
használatát
• Nagyobb programban konstans adatok
helyett is használjunk változót, így
könnyebb később megváltoztatni
Még egy értékadó függvény
• (set szimbólum kifejezés)
• Beállítja a szimbólum kiértékelésének
eredményét a kifejezés kiértékelésének
eredményére
• Például:
–
–
–
–
–
–
–
(setq a 6.0)
(set ‘b a)
b
(set ‘c ‘b)
(set c 1)
c
b
=
=
=
=
=
=
=
6.0
6.0
6.0
b
1
b
1
Lokális-globális változók
• Függvényen kívül használt setq,
globális változót definiál
• Lokális változó definiálása:
set
(defun fvg ( / lok1 ) ... )
• Egy lokális változó „eltakarhat” (shadow)
egy másik globális vagy lokális változót
Példa 1.
(defun a ()
(setq x 2)
)
(setq x 1)
(a) ;belépésnél
(setq x 2)
x
x
x
x
x
1
1
2
2
Példa 2.
(defun a ( x ) ; arg -> új doboz
(setq x 2)
)
; kilépésnél elveszünk dobozt
(setq x 1)
(a 3) ;belépésnél
(setq x 2)
x
x
x
x
x
1
1
1
1
3
2
Példa 3.
(defun a ( / x ) ; lokális változó -> új doboz
(setq x 2)
)
; kilépésnél elveszünk dobozt
(setq x 1)
(a)
;belépésnél
(setq x 2)
x
x
x
x
x
1
1 nil
1 2
1
Függvény függvényben
• Melyik változó és függvény honnan érhető el ?
(defun my_prog ( / Var1 Var2)
(defun sub_prog ( )
(list Var1 Var2)
)
(setq Var3 (sub_prog))
)
AutoCAD parancs definiálása
• A függvény neve speciálisan definiált:
C:parancs_nev
• A függvény argumentistája üres kell legyen
• Az így definiált függvény közvetlenül
végrehajtható AutoCAD parancs lesz !
(defun c:ketto ()
(+ 1 1)
)
Összehasonlítás 1.
AutoLISP
AutoCAD
(defun ketto ()
(+ 1 1)
)
(defun c:ketto ()
(+ 1 1)
)
Command: (ketto)
2
Command: ketto
2
Összehasonlítás 2.
• Hogyan lehet definiálni egy függvényt ?
–
–
–
–
–
(defun
(defun
(defun
(defun
(defun
drawline () ... )
drawline (/ pntl pnt2) ... )
drawline (a / pntl pnt2) ... )
C:drawline () ... )
C:drawline (/ pntl pnt2) ... )
AutoCAD parancs használata
• AutoCAD parancsot hajt végre az AutoLISP
programból
(command argumentumok ... )
• Az argumentumok lehetnek számok, sztringek
vagy pont listák
• Az üres sztring ”” jelentése: a SPACE vagy az
ENTER billentyű lett lenyomva
• Argumentum nélkül *Cancel* -nek felel meg
Magyar AutoCAD parancsok
• Az AutoCAD parancsok magyarul is
megadhatók, de ebben az esetben más
AutoCAD alatt (pl. spanyol) nem lehet
használni
• Példa
– Rossz: (command
– Jó:
(command
”vonal” ”0,0” ”1,1” ””)
”_line” ”0,0” ”1,1” ””)
AutoCAD parancsok formája
Helyi, lefordított név (vonal)
linetype :
_linetype :
Nyelv független parancs
-linetype :
Dialógus ablak nélküli
.linetype :
Nem definiálható felül
._linetype, _.linetype :
Kombináció
AutoCAD parancs példa 1.
(defun c:xy ()
(command ”_line” ”0,0” ”1,0” ””)
(command ”_line” ‘(0 0) (list 0 1) ””)
)
AutoCAD parancs példa 2.
• Változók, listák is használhatók
(defun c:xy ( / origo )
(setq origo ‘(0 0))
(command ”_line” origo ”1,0” ””)
(command ”_line” origo (list 0 1) ””)
)
AutoCAD parancs példa 3.
• AutoCAD parancs felbontható több lépésre
(defun c:xy ( / origo )
(setq origo ‘(0 0))
(command ”_line”) ; vonal rajzolás kezdete
(command origo)
; első pont
; bármit lehet csinálni közben,
; kivéve AutoCAD parancsot használni
(command ”1,0”)
; második pont
(command ””)
; parancs lezárása
(command ”_line” origo (list 0 1) ””)
)