FastFiber

Boolean functie OPGELOST

Gestart door cetacad, wo 28 10 2009, 09:25:23

Vorige topic - Volgende topic

cetacad

In een vorig topic (attach/overlay) kwam ik de functie Boole tegen. In mijn (engels-talige) lispboek staat heel summier aangegeven hoe deze functie werkt, maar ik kom er niet uit.

Kan iemand mij helpen of weet iemand een nederlands-talige site met een uitleg.

Alvast bedankt.

Ceta.

roy_043

In computer science, the Boolean or logical data type is a primitive data type having one of two values: true or false.
Bron: http://en.wikipedia.org/wiki/Boolean_data_type.

In lisp wordt nil gebruikt voor false. Alles wat niet nil is wordt beschouwd als true.
In andere programmeertalen wordt het getal 0 (ook) beschouwd als false. In lisp is dat niet het geval.

In onderstaand voorbeeld levert (> 5 4) de waarde T (=True) op. En dus wordt "Groter" weergegeven:
(if (> 5 4) (princ "Groter"))
Nog een voorbeeld:
(if 0 (princ "Het getal nul is toch True"))
En tenslotte:
(setq myVar "ABC")(if myVar (princ "myVar is niet nil en dus ook True"))

Citaat van: cetacad op wo 28 10 2009, 09:25:23
In een vorig topic (attach/overlay) kwam ik de functie Boole tegen.
Hierboven staat een wat algemeen verhaal. Als jij wilt dat de functie die jij noemt wordt uitgelegd dan moet je een link geven.

cetacad

Bedankt, maar niet wat ik zoek.

In mijn lisp-boek staan een aantal voorbeelden:
(Boole 1 12 5)     returns  4
(Boole 6 6 5)       returns  3
(Boole 4 3 14)     returns  12

Mijn vraag is: Hoe werkt dit / Hoe komt deze return-waarde tot stand ?

Ceta.

roy_043

#3
Citaat van: roy_043 op wo 28 10 2009, 10:21:19Als jij wilt dat de functie die jij noemt wordt uitgelegd dan moet je een link geven.
<EDIT>Herstel: er bestaat een standaard lisp-functie Boole. Deze is mij nog onbekend. Ik zal er eens naar kijken.</EDIT>

roy_043

OK uitleg:
De lisp-functie boole verricht manipulaties op bit-niveau.
Dat wil zeggen dat getallen binair, bit voor bit, worden nagelopen.
Het eerste getal bepaalt hoe de functie werkt.

Een binair getal bestaat uit nullen en enen. Elke nul of één wordt een bit genoemd.
Van de binaire getallen hieronder worden 16 bits weergegeven:

binair            decimaal
0000000000000000   0
0000000000000001   1
0000000000000010   2
0000000000000011   3
0000000000000100   4
0000000000000101   5
0000000000000110   6
0000000000000111   7
0000000000001000   8
0000000000001001   9
0000000000001010  10
0000000000001011  11
0000000000001100  12
0000000000001101  13
0000000000001110  14
0000000000001111  15
0000000000010000  16

(boole 1 ... = bitgewijs "en"
d.w.z. een 1 in het eerste getal en een 1 in het tweede getal levert 1. Elke andere situatie levert 0.
Voorbeeld: (boole 1 12 5)
0000000000001100  12
0000000000000101   5
---------------------
0000000000000100   4

(boole 6 ... = bitgewijs "exclusief" (xor)
d.w.z. als de bits in het eerste getal en tweede getal verschillen levert dit 1. Elke andere situatie levert 0.
(boole 6 ... is een combinatie van (boole 2 ... en (boole 4 ...
Voorbeeld: (boole 6 6 5)
0000000000000110   6
0000000000000101   5
---------------------
0000000000000011   3

(boole 4 ...
d.w.z. een 0 in het eerste getal en een 1 in het tweede getal levert 1. Elke andere situatie levert 0.
Voorbeeld: (boole 4 3 14)
0000000000000011   3
0000000000001110  14
---------------------
0000000000001100  12


Wat kun je ermee? De functie boole is o.a. handig bij het manipuleren van osnap (OSMODE). Het volgende geldt:
binair           dec  osmode
0000000000000000   0
0000000000000001   1  endpoint
0000000000000010   2  midpoint
0000000000000100   4  center
0000000000001000   8  node
0000000000010000  16  quadrant
0000000000100000  32  intersection
etc...


Elke bit kan worden opgevat als een schakelaar. Als de meest rechtse bit aan staat (=1) dan is osnap endpoint actief etc.:
binair           dec  osmode
0000000000000001   1  endpoint
0000000000000010   2  midpoint
0000000000010000  16  quadrant +
--------------------------------
0000000000010011  19


Voorbeelden:
(if (/= (boole 1 (getvar "osmode") 4) 0) (princ "\Osnap CENTER staat aan "))

(setvar "osmode" (boole 7 (getvar "osmode") 4)) ; zet osnap CENTER aan, overige osnaps blijven ongewijzigd

(setvar "osmode" (boole 2 (getvar "osmode") 4)) ; zet osnap CENTER uit, overige osnaps blijven ongewijzigd

(setvar "osmode" (boole 6 (getvar "osmode") 4)) ; schakelt osnap CENTER om (d.w.z. "aan" als deze "uit" stond en
                                                ; omgekeerd), overige osnaps blijven ongewijzigd


Alternatieven voor de bovenstaande code-fragmenten:
(if (/= (logand (getvar "osmode") 4) 0) (princ "\Osnap CENTER staat aan "))

(setvar "osmode" (logior (getvar "osmode") 4))         ; zet osnap CENTER aan, overige osnaps blijven ongewijzigd

(setvar "osmode" (logand (getvar "osmode") (~ 4)))     ; zet osnap CENTER uit, overige osnaps blijven ongewijzigd

(if (/= (logand (getvar "osmode") 4) 0)                ; schakelt osnap CENTER om (d.w.z. "aan" als deze "uit" stond en
    (setvar "osmode" (logand (getvar "osmode") (~ 4))) ; omgekeerd), overige osnaps blijven ongewijzigd
    (setvar "osmode" (logior (getvar "osmode") 4))
)


Ik hoop dat het wat duidelijker is geworden.  :roll:

cetacad

Bedankt voor de uitleg.
Ik ben weer wat verder in de Lispologie.

ceta