Gå til innhold

Vi vil lage vårt eget programmeringsspråk


Gjest Slettet+56132

Anbefalte innlegg

ah, der kan man se .. hm .. den fungerer - eller den returnerer riktignok ikke en verdi slik Lisp-versjonen gjør, men det er kanskje urimelig å forvente:

 

cl-user> (let ((i 0))
          (format t "myWhile returns: ~A~%"
                  (myWhile (< i 2)
                    (format t "i: ~A~%" i)
                    (incf i)
                    (* i i))))
i: 0
i: 1
myWhile returns: 4

 

ok - jeg kan finne på flere eksempler; gjerne noen som er omtrent like enkle som `myWhile', men samtidig umulig(?) eller vanskelig å få til v.h.a. C .. det er faktisk vanskelig å finne på eksempler som er så enkle som mulig på både Lisp og C-siden samtidig som de illustrerer et poeng

 

sjekk:

http://lists.warhead.org.uk/pipermail/iwe/...uly/000130.html

(ser ut til at tegnet = ser slik ut "=3D" .. må være en bug med tegnsettet på serveren ellernoe)

 

..og sammenlign med:

 

(defmacro mySqrt (x)
 `(let ((tmp ,x))
    (* tmp tmp)))

cl-user> (mySqrt 10)
100
cl-user> (/ 2 (mySqrt 10))
1/50
cl-user> (mySqrt 2)
4
cl-user> (mySqrt 2.5)
6.25
cl-user> (mySqrt (+ 1 1))
4
cl-user> (defun randomNumber ()
          (let ((rnd (random 10)))
            (format t "generated random number: ~A~%" rnd)
            rnd))
randomNumber
cl-user> (mySqrt (randomNumber))
generated random number: 2
4
cl-user> (mySqrt (randomNumber))
generated random number: 5
25
cl-user> (macroexpand-1 '(mySqrt (randomNumber)))
(let ((tmp (randomNumber)))
 (* tmp tmp))
t

 

(macroexpand-1 er omtrent det samme som å kjøre ting igjennom C's preprocessor)

 

skulle tro dette var enklere å få til enn `myWhile'; noen som klarer denne i (standard) C? .. dette er selvfølgelig et veldig enkelt eksempel, men da kan en spørre seg selv hva som skjer når en hopper over til mer interessante eksempler

 

posten snakker litt om `switch' -> `if' .. det å lage en `switch' v.h.a. `if' er enkelt i Lisp, men ingenting her viser egentlig det som gjør Lisp og Lisp-makroer helt spesielt -- .. om noen knekker dette eksempelet også så kan jeg fortsette å gjøre ting som tilsynelatende burde vært enkelt å få til v.h.a. C-makroer, men som i stedet for å øke lineært m.t.p. vanskelighetsgrad øker eksponensiellt - mens de i Lisp forblir trivielle ..

 

det kommer ikke en gang frem det faktum at man _under selve ekspansjonen_ har tilgang til sine egne brukerdefinerte funksjoner for manipulering av kode (kode er lister .. lister er en datatype i lisp .. man kan manipulere data eller lister i lisp når som helst .. så .. skjønner?)

 

kompilering er det samme som konvertering; derfor kan man v.h.a. dette lage nye språk .. for eksempel kan en legge til sin egen versjon av `defclass' (samme som `class' i C++) med egne spesielle muligheter ..

 

her er et kall til en makro som definerer "views" eller sider i sammenheng med en web-server; den bruker `defclass' i bakhånd, men "passer på" at hver klasse har et statisk medlem kalt `template' og en rekke andre ting:

 

(defView Main ()
 :template-file "template-test.html"
 :widgets ((app-id Custom :content (id-of *app*))
           (some-link Hyperlink :link 'Other :label "Link to other page")
           (some-heading Custom :content "Main")
           (counter Custom :content (let ((counter 0))
                                      (lambda () (incf counter))))))

 

..så `defView' er nå en ny del av språket tilgjengelig når en ønsker å definere klasser med spesielle features.. dette blir fort vanskeligere v.h.a. pre-processoren i C eller templates i C++

Endret av handsape
Lenke til kommentar
Videoannonse
Annonse
Jeg tipper det kan være vrient å finne på gode eksempler, siden det ikke er noenting som er umulig i C eller C++

7249855[/snapback]

 

Om du her mener "turing complete" eller noe slikt - så er du så dum at jeg ikke ønsker å snakke med deg.

 

"Indulge me" om jeg misforstår - om du mener noe annet?

 

edit:

Altså til de som kanskje ikke forstår; en Lisp-kompiler kan generere C som så kompileres v.h.a. en C-kompiler til maskinkode, men hva betyr dette for deg som bruker av språket "på toppen"....?

 

Eller - si det slik da; det blir som å si at ingenting er umulig om en taster inn 0'ere og 1'ere direkte -- så klart stemmer det - men det er totalt meningsløst, irrelevant og rett og slett en dum ting å si. Som noen som gang på gang roper det som for alle er totalt åpenbart i utgangspunktet.

Endret av handsape
Lenke til kommentar

Det virker ihvertfall som om lisp har gode muligheter for å lage nye brukernavn når man har spredd nok propaganda med det gamle.

 

> Om du her mener "turing complete" eller noe slikt - så er du så dum at jeg ikke ønsker å snakke med deg.

Det er nok det han mener, og det er slett ikke så dumt. Hvis du allerede kan gjøre alt du vil er potensialet maksimert - du trenger ikke enda hundre måter å gjøre det samme på.

Lenke til kommentar
> Om du her mener "turing complete" eller noe slikt - så er du så dum at jeg ikke ønsker å snakke med deg.

Det er nok det han mener, og det er slett ikke så dumt. Hvis du allerede kan gjøre alt du vil er potensialet maksimert - du trenger ikke enda hundre måter å gjøre det samme på.

7253103[/snapback]

 

Om dere ikke forstår hvorfor man abstraherer over maskinen i utgangspunktet mangler dere grunnleggende forståelse og innsikt. Jeg kan ikke bruke tid på å forklare dette til mennesker som ikke en gang _vil_ forstå hvorfor man _også_ abstraherer v.h.a. C (edit: dette spesielt ref. tidligere post fra deg der du tydelig viste mangel på forståelse på hvorfor en skiller data, struktur og bruker-kode).

 

..det kan hende du gjør deg til og "leker idiot" for egen underholdnings skyld..

 

Så dette ønsker jeg ikke diskutere med hverken deg eller Geir - om dere ikke har ordentlige spørsmål (C-makroen `myWhile' Geir postet er et fornuftig innlegg f.eks.!) eller on-topic innlegg i stedet for å poste ting dere åpenbart bør vite er idioti og/eller trolling.

 

Post heller kode som illustrerer hvor god C (eller whatever) er til å "mekke" språk eller domene-språk på sparket. I stedet for å jobbe parallelt med det hver av oss kan best så angriper dere meg med å trolle fordi dere er smålige og har ikke egne ordentlige argumenter eller ting å bidra med fra "deres side". En får anta at det er fordi dere allerede har innsett noe, men mangler et par skruer eller er ikke modne nok på et eller annet vis.

Endret av handsape
Lenke til kommentar

Det er snakk om makro språket i C++ vs. makro språket i lisp, hvor det i lisp er veldig utbygd, mens det i C++ ikke er ment for å bytte ut kode på den måten som med square() eksempelet.

Hvor en i C++ ville skrevet

template <type T> square(T value) { return value * value; }

som alltid ville gitt riktig verdi, men det ville vært en vanlig, inline funksjon, framfor en funksjon som er laget av preprocessoren.

og ikke #define square(value) value * value, siden dette gir, som forfratteren sier, mange problemer da dette gjelder preprocessoren, og ikke C++ compileren.

 

template <type T> MySquare(T val) { return val * val; }
void randomNumber() 
{
 int rnd = MySquare(rand() % 10);
 cout << "generated random number:" << rnd;
}
int main()
{
 randomNumber();
 return 0;
}

 

En makro versjon ville faktisk gitt et bedre resultat, men makro-funksjonen i C++ er ikke spesielt forseggjort.

 

Du trenger ikke være så forbanna arrogant alltid.

Lenke til kommentar
Post heller kode som illustrerer hvor god C (eller whatever) er til å "mekke" språk eller domene-språk på sparket.

C er jo, som du viste, totalt ubrukelig til det. Det jeg prøvde å si var at det spiller liten eller ingen rolle etter som man kan komme frem til et hvert ferdig resultat uten den funksjonaliteten.

 

..det kan hende du gjør deg til og "leker idiot" for egen underholdnings skyld..

Jeg beklager at jeg desverre ikke kan si det samme om deg: at du leker idiot.

Endret av tsg1zzn
Lenke til kommentar
Post heller kode som illustrerer hvor god C (eller whatever) er til å "mekke" språk eller domene-språk på sparket.

C er jo, som du viste, totalt ubrukelig til det. Det jeg prøvde å si var at det spiller liten eller ingen rolle etter som man kan komme frem til et hvert ferdig resultat uten den funksjonaliteten.

7257053[/snapback]

 

Ok - la oss se du gjennomføre dette i praksis?

 

..og ikke lat som om dette ikke i første omgang handler om praksis (dette har jeg vært inne på tidligere i tråden)..

 

edit:

Dette tilsvarer å bryte inn og begynne å diskutere hjernens kjemi blant de involverte som noe relevant for å forstå problemet eller grunnlaget for hvorfor det har oppstått et problem og hvordan en skal komme frem til en løsning i barnehagen -- for så å gå videre til skrittet under der en begynner å snakke om at kjemi i bunn og grunn er basert på "fysikk og atomer og sånn" og at man derfor kan spore alt tilbake til dette; altså både problemet og løsningen "at hand".

 

Du sier at alt annet er irrelevant og unyttig; at man ikke trenger kunnskap om - eller at verktøy for å jobbe med, ting over "atomer og kvantefysikk" er unyttig og overflødig. Er ikke dette idioti så vet ikke jeg.

 

Det finnes problemer som må løses i den "virkelige verden" skjønner du; sosiale og praktiske. Alle vet at det foregår noe under som regnes for "fakta", men som i "virkeligheten" blir irrelevant fordi en har _ingen mulighet_ til å røre ved det eller endre det direkte når en jobber med noe et stykke over det.

 

*switch!/reality-check*: Forstår du ikke at ting foregår på flere nivåer og at det er upraktisk (les: umulig) å angripe ting langt unna "problem-domenet" du har foran deg så kommer du _ingen vei_.

 

Det betyr ikke at folk rundt deg - og i _hvertfall ikke_ jeg, ikke forstår den andre siden av saken som du gang på gang forsøker å få frem her. Så jeg forstår begge sider - spørsmålet blir om du gjør det; forstår noe som helst av det jeg har sagt og sier..?

 

(problem-domene: http://www.linuxguiden.no/index.php/H%C3%B...C3%A5spr%C3%A5k )

Endret av handsape
Lenke til kommentar
*switch!/reality-check*: Forstår du ikke at ting foregår på flere nivåer og at det er upraktisk (les: umulig) å angripe ting langt unna "problem-domenet" du har foran deg så kommer du _ingen vei_.

For å dra temaet tilbake til "vårt eget programmeringsspråk" så har jeg jo faktisk kommet ganske langt.

 

Grunnen til det er at jeg har angrepet problemet kort fra "problem-domenet" og dermed unngått å abstrahere meg langt ut i de svenske skoger slik du argumenterer for at man bør.

 

Uansett så er nok Lisp et bra språk, men det er flere måter å gjøre ting på, og hvis det var løsningen på alt så ville jo alle bruke Lisp. Det er riktignok mulig at ikke flere bruker Lisp ganske enkelt fordi de er for dumme til å se fordelene ved det. Problemet er at hvis du er så dum så vil du heller ikke være i stand til å bruke Lisp for det det er verdt, og du gjør klokt i holde deg unna.

Lenke til kommentar
*switch!/reality-check*: Forstår du ikke at ting foregår på flere nivåer og at det er upraktisk (les: umulig) å angripe ting langt unna "problem-domenet" du har foran deg så kommer du _ingen vei_.

For å dra temaet tilbake til "vårt eget programmeringsspråk" så har jeg jo faktisk kommet ganske langt.

 

Grunnen til det er at jeg har angrepet problemet kort fra "problem-domenet"..

7257328[/snapback]

 

Aha - så du har altså implementert din egne halvferdige, brekte versjon av Lisp:

 

«Any sufficiently complicated C or Fortran program contains an ad-hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp.»

 

 

Igjen; alle turing-complete språk kan representere hverandre; det er ikke dét dette handler om. Poenget er hvor man starter (#1); man kan lage en C-kompiler v.h.a. VB om en ønsker .. hva er vitsen?

 

#1: Dog; jeg er noe for det å starte fra bunnen og opp om en ikke har greie på lavnivå-ting i det hele tatt: http://download.savannah.gnu.org/releases/...-0-booksize.pdf

 

..men man gjennomfører ikke en implementasjon av noen som helst betydning i praksis v.h.a. dette.

Endret av handsape
Lenke til kommentar

Aha - så du har altså implementert din egne halvferdige, brekte versjon av Lisp:

 

«Any sufficiently complicated C or Fortran program contains an ad-hoc, informally-specified, bug-ridden, slow implementation of half of Common Lisp.»

 

7257442[/snapback]

Ganske usaklig å kommentere kildekoden min før du har sett den, synes du ikke?

Lenke til kommentar

tsg1zzn:

Du vet godt hva jeg kommenterer.

 

 

GeirGrusom (så ikke posten din før nå):

Nei, den der gjør ikke det samme som Lisp-versjonen. Det slutt-resultatet "gjør" er heller ikke poenget, men dette tror jeg du har forstått.

 

..et annet eksempel.. jeg _tror_ ikke dette er mulig å få til med C++'s templates - men jeg kan ta feil i farta her - uansett går det ikke an å gjennomføre det på samme vis:

 

Litt terminologi først:

 

* ''slot'' er det samme som et "medlem"

* En sier i Lisp at medlemmet har ''klasse-allokering'' når en mener at medlemmet er statisk.

 

Tenk deg at du ønsker et sett klasser som hver skal ha:

 

* En egen slot med navn ''values''.

* Slotten ''values'' skal være statisk, slik at flere instanser av hver enkelt respektive klasse vil dele verdien eller dataene i slotten.

 

Det er viktig å få med seg at dette ikke er mulig å få til ved hjelp av arv.

 

Om vi tenker oss at en ønsker å opprette klassene ''Shape'', ''Circle'', ''Rectangle'' og ''Triangle'' - der ''Shape'' er superklassen blant dem, kan man «manuelt» gjøre dette slik:

 

(defclass Shape ()
 ((x-pos :initform 0)
  (y-pos :initform 0)))

(defclass Circle (Shape)
 ((values :allocation :class)
  (radius :initform 10)))

(defclass Rectangle (Shape)
 ((values :allocation :class)
  (radius :initform 10)
  (x-pos2 :initform 0)
  (y-pos2 :initform 0)))

(defclass Triangle (Shape)
 ((values :allocation :class)
  (x-pos2 :initform 0)
  (y-pos2 :initform 0)
  (x-pos3 :initform 0)
  (y-pos3 :initform 0)))

 

En må altså legge til ''(values :allocation :class)'' hver eneste gang en definerer en ny klasse.

 

For klassene ''Circle'', ''Rectangle'' og ''Triangle'' hadde det nå vært greit om det eksisterte en ny måte å definere klasser på som gjorde at en slapp å ta med slotten ''values'' manuelt siden den skal med i hver av disse uansett. Dette løser vi ved å legge til et nytt ''nøkkelord'' som vi døper ''defvclass''. Det blir som om en i C++ eller Java la til et nytt nøkkelord bygget på nøkkelordet ''class'':

 

(defmacro defvclass (name superclasses slots &rest options)
 `(defclass ,name ,superclasses
    ((values :accessor values-of :allocation :class)
     ,@slots)
    ,@options))

 

Nå blir eksempelet over seendes slik ut:

 

(defclass Shape ()
 ((x-pos :initform 0)
  (y-pos :initform 0)))

(defvclass Circle (Shape)
 ((radius :initform 10)))

(defvclass Rectangle (Shape)
 ((radius :initform 10)
  (x-pos2 :initform 0)
  (y-pos2 :initform 0)))

(defvclass Triangle (Shape)
 ((x-pos2 :initform 0)
  (y-pos2 :initform 0)
  (x-pos3 :initform 0)
  (y-pos3 :initform 0)))

 

..en slipper altså å ta med det statiske medlemmet ''values'' i hver klasse-definisjon.

 

Ved hjelp av funksjonen ''macroexpand-1'' kan man se hva som skjer i bakhånd:

 

cl-user> (macroexpand-1 '(defvclass Circle (Shape)
                         ((radius :initform 10))))
(defclass Circle (Shape)
         ((values :accessor values-of :allocation :class)
          (radius :initform 10)))

 

..dette tilsvarer altså det å titte på hva preprocessoren ''(norsk ord?)'' i C spytter ut. En kan også titte direkte på ekspansjonene rett i koden ved å taste ''C-c <enter>'' i Slime:

 

(defclass Rectangle (Shape)
 ((values :accessor values-of :allocation :class)
  (radius :initform 10) 
  (x-pos2 :initform 0) 
  (y-pos2 :initform 0)))

...

(defclass Triangle (Shape)
 ((values :accessor values-of :allocation :class) 
  (x-pos2 :initform 0)
  (y-pos2 :initform 0) 
  (x-pos3 :initform 0) 
  (y-pos3 :initform 0)))

 

Makroen gjør altså jobben med å legge til ''values'' for oss.

 

Det må nevnes at dette kun viser en brøkdel av hva som er mulig ved hjelp av makroer. Boken ''On Lisp'' er kanskje ikke den man begynner med, men den er full av gode eksempler på bruk av makroer og andre teknikker.

 

(Det ligger forresten en liten makro som gjør at en slipper å skrive '':initform'' hele tiden her: http://nostdal.org/~lars/programming/lisp/defclazz/ )

 

edit: angående det siste du nevner så tror jeg du kan google etter "smug lisp weenie"

Endret av handsape
Lenke til kommentar
.et annet eksempel.. jeg _tror_ ikke dette er mulig å få til med C++'s templates - men jeg kan ta feil i farta her - uansett går det ikke an å gjennomføre det på samme vis:

 

Litt terminologi først:

 

* ''slot'' er det samme som et "medlem"

* En sier i Lisp at medlemmet har ''klasse-allokering'' når en mener at medlemmet er statisk.

 

Tenk deg at du ønsker et sett klasser som hver skal ha:

 

* En egen slot med navn ''values''.

* Slotten ''values'' skal være statisk, slik at flere instanser av hver enkelt respektive klasse vil dele verdien eller dataene i slotten.

 

Det er viktig å få med seg at dette ikke er mulig å få til ved hjelp av arv.

 

Trenger ikke templates for å gjøre det...

Si ifra hvis du mente noe annet:

class MyClass
{
public:	static int values;
};
class MyInheritedClass : public MyClass
{
public:
static int values;
};

#define DeclareValuesInheritedClass(ClassName, SuperClass) class ClassName : SuperClass { public: static int values;
#define DeclareValuesClass(ClassName) class ClassName {public: static int values;
#define EndValuesClass(ClassName) }; int ClassName::values = 0;

int MyClass::values = 0;
int MyInheritedClass::values = 0;

DeclareValuesInheritedClass(MyThirdNewClass, MyClass)
 void MySub();
EndValuesClass(MyThirdNewClass);

int main()
{
MyThirdNewClass cl = MyThirdNewClass();
MyThirdNewClass cl2 = MyThirdNewClass();
MyClass clbase = MyClass();

cl.values = 100;
printf("cl values:%d\n", cl.values);
cl2.values = 200;
printf("cl2 changed value to 200\n");
printf("cl values:%d\n", cl.values);
printf("clbase values:%d", clbase.values);

}

Lenke til kommentar
.et annet eksempel.. jeg _tror_ ikke dette er mulig å få til med C++'s templates - men jeg kan ta feil i farta her - uansett går det ikke an å gjennomføre det på samme vis:

 

Litt terminologi først:

 

* ''slot'' er det samme som et "medlem"

* En sier i Lisp at medlemmet har ''klasse-allokering'' når en mener at medlemmet er statisk.

 

Tenk deg at du ønsker et sett klasser som hver skal ha:

 

* En egen slot med navn ''values''.

* Slotten ''values'' skal være statisk, slik at flere instanser av hver enkelt respektive klasse vil dele verdien eller dataene i slotten.

 

Det er viktig å få med seg at dette ikke er mulig å få til ved hjelp av arv.

 

Trenger ikke templates for å gjøre det...

Si ifra hvis du mente noe annet:

class MyClass
{
public:	static int values;
};
class MyInheritedClass : public MyClass
{
public:
static int values;
};

#define DeclareValuesInheritedClass(ClassName, SuperClass) class ClassName : SuperClass { public: static int values;
#define DeclareValuesClass(ClassName) class ClassName {public: static int values;
#define EndValuesClass(ClassName) }; int ClassName::values = 0;

int MyClass::values = 0;
int MyInheritedClass::values = 0;

DeclareValuesInheritedClass(MyThirdNewClass, MyClass)
 void MySub();
EndValuesClass(MyThirdNewClass);

int main()
{
MyThirdNewClass cl = MyThirdNewClass();
MyThirdNewClass cl2 = MyThirdNewClass();
MyClass clbase = MyClass();

cl.values = 100;
printf("cl values:%d\n", cl.values);
cl2.values = 200;
printf("cl2 changed value to 200\n");
printf("cl values:%d\n", cl.values);
printf("clbase values:%d", clbase.values);

}

7258655[/snapback]

 

Haha, hå'key! -- Hm, hva med:

 

* `public:' er ikke "default" i en klasse der ingenting er spesifisert forran første medlem.

* Hva med templates ..og template-templates etc.

* Multiple inheritance

* ..uhm..et par andre ting jeg sikkert har glemt

 

Husk at:

 

* `defvclass' ikke brekker når den blir brukt - enten av deg eller annen kode, i sammenhenger som "forventer" `defclass'.

* `defvclass' er kun _én_ makro - ikke flere; du har tatt med to som må brukes om hverandre alt ettersom sammenheng og tar jeg ikke helt feil så vil dette antallet vokse drastisk om du skal ha noe som ikke brekker C++'s syntax for `class'.

 

Tipper dette er noe som vil gi "interessante" problemer i sammenheng med feilsøking og debugging også. Syntax er ikke akkurat konsis den heller. :}

 

..men som jeg nevnte helt i starten; "whatever rocks your boat" (uhm, eller det var vel "..man får vurdere hva man er ute etter..")..

 

Ok, en gang til -- lol:

 

(defmacro non-deterministic (x y z)
 (if (zerop (random 2))
  `(,x ,y ,z)
  `(,x ,z ,y)))


cl-user> (non-deterministic - 5 3)
2
cl-user> (non-deterministic - 5 3)
-2
cl-user> (non-deterministic - 5 3)
2
cl-user> (non-deterministic - 5 3)
2
cl-user> (non-deterministic - 5 3)

 

Fikser du denne? Merk at `random' kunne vært en egendefinert funksjon; den er ikke spesiell syntax ellernoe slikt.

 

edit: ny bruker igjen btw. .. hurra; jeg burde holdt telling \o/

Endret av norfolk
Lenke til kommentar
Ok, en gang til -- lol:

 

(defmacro non-deterministic (x y z)
 (if (zerop (random 2))
  `(,x ,y ,z)
  `(,x ,z ,y)))


cl-user> (non-deterministic - 5 3)
2
cl-user> (non-deterministic - 5 3)
-2
cl-user> (non-deterministic - 5 3)
2
cl-user> (non-deterministic - 5 3)
2
cl-user> (non-deterministic - 5 3)

 

Fikser du denne? Merk at `random' kunne vært en egendefinert funksjon; den er ikke spesiell syntax ellernoe slikt.

 

edit: ny bruker igjen btw. .. hurra; jeg burde holdt telling \o/

7259171[/snapback]

 

C++s template-system er turing-komplett, så det lar seg gjøre, men hvor praktisk det er vet jeg ikke. Problemet med C-preprosessoren er at den opererer på konkret syntaks, mens Lisp-makroer opererer direkte på syntakstreet, noe som er en enorm fordel.

Lenke til kommentar

Jeg gjør så godt jeg kan :p

Men preprosessoren i C++ er ikke så veldig omfattende :p

 

Man ser fort at det begynner å ligne på basic :S

 

* `public:' er ikke "default" i en klasse der ingenting er spesifisert forran første medlem.
avslutt med en private: så er det løst.

Men de andre er det ikke så lett å gjøre noe med.

 

(defmacro non-deterministic (x y z)
(if (zerop (random 2))
 `(,x ,y ,z)
 `(,x ,z ,y)))


cl-user> (non-deterministic - 5 3)
2
cl-user> (non-deterministic - 5 3)
-2
cl-user> (non-deterministic - 5 3)
2
cl-user> (non-deterministic - 5 3)
2
cl-user> (non-deterministic - 5 3)

... jeg forstår ikke hva koden gjør :/

Hva gjør funksjonen , ?

Lenke til kommentar

*arf* .. ennå en bruker; gidder ikke opprette flere på en stund nå så dette blir siste innlegg for denne gang tror jeg

 

(defmacro non-deterministic (x y z)
(if (zerop (random 2))
 `(,x ,y ,z)
 `(,x ,z ,y)))


cl-user> (non-deterministic - 5 3)
2
cl-user> (non-deterministic - 5 3)
-2
cl-user> (non-deterministic - 5 3)
2
cl-user> (non-deterministic - 5 3)
2
cl-user> (non-deterministic - 5 3)

... jeg forstår ikke hva koden gjør :/

Hva gjør funksjonen , ?

7259721[/snapback]

 

lat som om , og ` ikke er der .. altså at x y og z blir erstattet med det som blir sendt inn .. altså - 5 og 3

 

..videre..

 

(- 5 3) gir 2

(- 3 5) gir -2

 

..basert på om (random 2) returnerer 0 eller 1 -- som igjen sjekkes v.h.a. zerop som gir true eller false alt ettersom

 

..i grunn blir vel dette ganske likt som mySquare-saken tidligere - jeg er trøtt i kålen; men en forskjell er at den viser at man kan kalle og bruke vilkårlig kode og funksjoner @ compile/expansion-time

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...