Zobrazit plnou verzi příspěvku: cond

Ferdinand
05.03.2009, 14:20
Funkce funguje takto:
(cond
(podminka1) (akce1)
(podminka2) (akce2)
...
)
 
Řetězce VADNO, VAREV, VASTR, DWG, LN byly v předchozím oddílu nadefinováva resp. získána a přesto ze sekce
(cond  (and (= VADNO nil) (= VAREV nil) (/= VASTR nil))  (setq NNR (strcat DWG "#" LN "_" VASTR))  (and (= VADNO nil) (/= VAREV nil) (= VASTR nil))  (setq NNR (strcat DWG "#" LN "_" VAREV))  (and (= VADNO nil) (/= VAREV nil) (/= VASTR nil))  (setq NNR (strcat DWG "#" LN "_" VAREV "_" VASTR))  (and (= VADNO nil) (= VAREV nil) (= VASTR nil))  (setq NNR (strcat DWG "#" LN))  (and (/= VADNO nil) (/= VAREV nil) (= VASTR nil))  (setq NNR (strcat VADNO "_" VAREV))  (and (/= VADNO nil) (= VAREV nil) (/= VASTR nil))  (setq NNR (strcat VADNO "_" VASTR))  (and (/= VADNO nil) (/= VAREV nil) (/= VASTR nil))  (setq NNR (strcat VADNO "_" VAREV "_" VASTR)))
 
mi to vrací T a !NNR je nil . Když jsem to zkoušel po řádcích např.
(cond  (and (/= VADNO nil) (/= VAREV nil) (/= VASTR nil))  (setq NNR (strcat VADNO "_" VAREV "_" VASTR)))
tak to taky vrací jen T a !NNR jako nil . Když to zadám jako podmínku

(if  (and (/= VADNO nil) (/= VAREV nil) (/= VASTR nil))  (setq NNR (strcat VADNO "_" VAREV "_" VASTR)))
tak to vrátí odpovídající seskládaný řetězec. To nelze použít v cond logické funkce?

Vladimír Michl
05.03.2009, 15:27
Máte tam nějak divně závorky (a nil = false) - zkusil bych spíš:
 
[CODE]
(cond
 ( (and (not VADNO)(not VAREV) VASTR) (setq NNR "xxxx"))
...
)
[/CODE]

Ferdinand
06.03.2009, 10:33
Lze použít hvězdičkovou konvenci? Myslím něco jako
cond
((= NFOR "A4*") (setq FORMAT "A4 (210.00 x 297.00 MM)")
...
)
Pokud to napíšu v této podobě, tak mi to vyhodnotí jako nil. Chci aby to platilo pro NFOR=("A4" anebo "A4-1" anebo "A4_ru" anebo "A4#L" anebo "A4 ISO").
ED: Aha, takže to má fungovat takhle
(cond
((podminka1) (akce1))
...
)Ferdinand2009-03-06 10:47:08

pavelstyl
06.03.2009, 10:36
[QUOTE=Ferdinand]Lze použít hvězdičkovou konvenci? Myslím něco jako
cond
((= NFOR "A4*") (setq FORMAT "A4 (210.00 x 297.00 MM)")
...
)
Pokud to napíšu v této podobě, tak mi to vyhodnotí jako nil. Chci aby to platilo pro NFOR=("A4" anebo "A4-1" anebo "A4_ru" anebo "A4#L" anebo "A4 ISO"). [/QUOTE]
 
 
A co příkaz (wcmatch). Ten by to měl umět.
Pavel Štyl

Sedláček
06.03.2009, 10:49
Nebo použít SUBSTR pro práci s řetězci.
Pak něco jako: (nezkoušeno)
 

cond
((= NFOR "A4*") (setq FORMAT (substr "A4 (210.00 x 297.00 MM)" 1 2))

Ferdinand
06.03.2009, 11:16
[QUOTE=pavelstyl] 
A co příkaz (wcmatch). Ten by to měl umět.
Pavel Štyl[/QUOTE]
Děkuji.
Gratuluji k tomuhle 100. příspěvku!

Ferdinand
06.03.2009, 12:38
Lze kombinovat dohromady "=" a "wcmatch" ? To pro konkrétní případ, když je NFOR čistě jenom "A3" a pak může být ještě "A31_ru" anebo "A31_en" anebo "A31_cz" . Takhle mi to nechce brát (vrací nil):
(cond
((or (= NFOR "A3")(wcmatch NFOR "A31_*")) (setq FORMAT...
...
)

Vladimír Michl
06.03.2009, 13:34
Lze, ale stačí to napsat do jednoho wcmatch:
 
[CODE](wcmatch NFOR "A3,A31_??")[/CODE]

Ferdinand
09.03.2009, 08:44
To je elegantní. Děkuji za osvětlení.
Ještě jsem se chtěl pro jistotu zeptat: * (hvězdičku) u wcmatch nelze použít?Ferdinand2009-03-09 08:47:59

Vladimír Michl
09.03.2009, 11:17
Lze.

Ferdinand
09.07.2009, 15:03
Došel jsem k dalšímu problému:
Budu chtít zjistit konkrétní hodnotu (ani jeden z nich nesmí být nil) pro 3 prom. takhle:
V1...má být řetězec který začíná na "3UCZ"
V2....má být nenulové celé číslo větší než 0
V3....má být = 1
tak podmínku zapíšu ve tvaru
(cond  (and (= V1 "3UCZ*") (= V2 ???) (= V3 1))  (setq NNR (strcat V1 "_" V2 "_" V3)))
...ale jak tam zakomponovat tu podmínku pro V2 ?Ferdinand2009-07-09 15:09:13

Martin Bielina
09.07.2009, 16:27
A co třeba takhle:

...
(cond  (and (= V1 "3UCZ*") (> V2 0) (= V2 (fix V2)) (= V3 1))  (setq NNR (strcat V1 "_" V2 "_" V3)))
...

Ferdinand
10.07.2009, 13:20
Martine, děkuji, tu formu s tím fix jsem neznal (nebo nejspíš zapomněl...). Pokud chci zjistit všeobecně hodnotu nějaké proměnné, tak lze nějak rozpoznat jestli je to INTEGER, REAL, STRING či dokonce LIST ? Dle uvedeného vyvozuji, že fix je pro INTEGER. Ve vlastnostech u klíče 0 je to totiž vždy jen "text" anebo "attrib" . Jde mi o ten způsob zápisu do podmínky cons . Ferdinand2009-07-10 13:21:10

alfred
10.07.2009, 13:30
(type item)

Ferdinand
10.07.2009, 14:14
Takže podmínku
"pokud je v proměnné PP1 obsažena hodnota typu INTEGER, proveď AKCE1, pokud je typu REAL, proveď AKCE2, pokud je typu STRING, proveď AKCE3, pokud je typu LIST, proveď AKCE4"
napíšu jako
(cond

((type item (= PP1 (fix PP1)))
(AKCE1))
((type item (= PP1 (real PP1)))
(AKCE2))

((type item (= PP1 (string PP1)))
(AKCE3))

((type item (= PP1 (list PP1)))
(AKCE4))
)
?
Protože když napíšu do př.ř. jenom samotné (type item) tak to bez ohledu na to, zda předtím jsem označil nějakou entitu či ne vrací SUBR (což nevím, co znamená).

Martin Bielina
13.07.2009, 09:59
aplikace COND a TYPE na Váš případ

(cond((= (type PP1) "INT"))(AKCE1))((= (type PP1) "REAL"))(AKCE2))((= (type PP1) "STR"))(AKCE3))((= (type PP1) "LIST"))(AKCE4)))
SUBR - taho hodnota vrácená funkcí TYPE znamená funkci načtenou Autocadem z kompilovaných souborů VLX FAS nebo také ze zdojových souborů LSP.

Jestli jsem někde něco napsal (opsal z nápovědy AutoCadu) špatně... ať mi prsty upadnou

Ferdinand
13.07.2009, 15:12
OT: To je ukázkový příklad, jak jsem líný zmáčknout F1 a přečíst si Help...