Björn Lindberg wrote:
>Perl är att ha tusen prylar som egentligen inte alls har med bakning
>tillhands, typ ett par badtofflor, en stekspade, en ask gummisnoddar
>och så vidare. :-)
>
>
Ja, så kan det säkert vara. Läste du min "hyllning" till perl i cll nyligen?
Message-ID: <iGN8e.134869$***@newsc.telia.net>
>>Jag tror (nb: tror, inte vet) att en som har vana från att jobba med
>>lisp-1 oftare använder programmeringstekniker som de i
>>SICP. Funktioner som returnerar funktioner som returnerar funktioner.
>>
>>
>
>Så kan det säkert vara, men det tror jag har med andra skillnader att
>göra, både kulturella och rent dogmatiska. Dels är schemekulturen mer
>dogmatisk kring funktionell programmering, rekursion o.dyl.,
>
Ja, den stolliga dogmatiken gäller det att stålsätta sig mot. Jag är en
glad set!-användare.
> dels har
>CL-programmeraren helt enkelt mer i verktygslådan: dynamiska
>variabler, CLOS, conditionsystemet, etc. Medan schemeprogrammeraren
>funderar på hur han kan bygga om sin iteration till en rekursion har
>CL-programmeraren redan skrivit den med DOLIST eller LOOP och gått
>vidare. :-)
>
>
När man håller på med sånt tjafs är det ju bara på lek.
OBS OBS OBS! do finns i scheme-standarden och har funnits sedan
sjuttiotalet.
Jag använder sällan rekursion för att uttrycka iteration; oftast
använder jag srfi-42.
Jag använder knappast ens explicit rekursion för rekursion, om det går
att skriva med en variant av fold.
Ibland tycker jag att det kan bli snyggt med att använda rekursion som
iteration, som t.ex. följande funktion som returnerar ett tal i
fibonaccisekvensen varje gång den anropas:
(define (fib)
(let loop ((i 1) (j 1))
(yield j)
(loop (+ j i) i)))
Den skulle man ju kunna göra med iteration om man vill, eftersom det är
en rent iterativ process.
>(Låt mig förekomma invändningen att Scheme visst har alla dessa
>verktyg i mer eller mindre exotiska SRFI:er: det fina med CL är inte
>bara att alla dessa saker finns till hands, utan även att de passar
>ihop så bra med varandra.
>
Men passar de dåligt ihop i scheme, menar du?
>
>
>>I scheme är det enda man behöver komma ihåg hur en lambda fungerar.
>>
>>Exempel:
>>
>>(define (make-grower)
>> (let ((s 0))
>> (lambda ()
>> (set! s (add1 s))
>> s)))
>>
>>(define gen-id (make-grower))
>>
>>Det här går att göra i CL med motsvarande mängd kod, men jag har
>>FORTFARANDE inte memorerat hur man gör - och i den mån den
>>programmeringstekniken används är det (tror jag) på grund av schemare
>>som infört detta till CL, eller CL:are som läst t.ex. SICP.
>>
>>
>
>Redan din inställning här förklarar nog till stor del skillnaden. Jag
>ser inget egenvärde i att skriva extremt funktionell/applikativ kod om
>det inte löser problemet bättre. Det är bara *ett* verktyg i lådan.
>
>(Så här skulle det se ut i CL:
>
> (defun make-grower ()
> (let ((s 0))
> #'(lambda () (incf s))))
>)
>
>
Alltså, mitt exempel hade lika gärna kunnat vara
(define (make-grower)
(let ((s 0))
(lambda ()
(incf s))))
om man så vill, och om man har en incf.
(define-syntax incf
(syntax-rules ()
((_ n)
(set! n (add1 n)))))
Men vad jag fortfarande inte hade memorerat var om huruvida jag skulle använda let eller labels, om jag skulle använda #' eller funcall, om mina growers behöver använda funcall, etc etc.
(defun gen-id (make-grower))
ERROR ERROR ERROR
(setq gen-id (make-grower))
ERROR ERROR ERROR
Efter ett och ett halvt år sedan vi sist talade om detta har det fortfarande inte gått in i min skalle! "Lättlärt?" Inte jämfört med scheme:n.
>>Jag såg att du hade använt det liknande, klassiska
>>make-bank-account-exemplet, som är ett exempel på denna
>>programmeringsteknik. Du valde att göra ett macro för att dölja
>>funcall!
>>
>>
>
>Nej. Makrot var för att man skulle slippa skriva 'meddelande i
>anropet. Syntaktiskt socker med andra ord. SEND kunde lika gärna varit
>en funktion.
>
>
>
>>I scheme blir defparameter en vanlig define, defun blir en vanlig
>>define, funcall behövs inte, send behövs inte... ((konto 'withdraw)
>>80) är allt man behöver. (Jag gjorde en gång i tiden ett macro på
>>detta som gjorde att man kunde skriva (withdraw konto 80) a la
>>clos. Men det är överkurs.)
>>
>>
>
>Scheme har sina brister det med. Inre DEFINE t.ex.
>
Detta ska ändras med R6RS.
>eller BEGIN:s olika
>semantik i olika situationer.
>
>
Ja, verkligen!
Men det handlar inte om scheme vs CL. Det handlar om lisp-1 vs lisp-2.
>Två fördelar jag ser med CL:s lisp-2-aktighet:
>
> - Det visar sig att lisp-2 passar väldigt bra med DEFMACRO, och jag
> råkar tycka att DEFMACRO är ett väldigt bra sätt att definiera
> makron på.
>
>
Problemet med defmacro är namnrymder överlag. Det bör man lösa med något
generellt sätt (modules?), inte med en godtycklig indelning i funktioner
och värden.
Jag har i cls föreslagit en lösning som är defmacro-liknande men där
alla identifiers utom de man explicit anger är i en annan namnrymd,
specifikt för det macrot. Ett stort flamewar inleddes som slutade med
att någon praktiskt implementerade mitt förslag!
> - Symboler i CL är riktiga datastrukturer, istället för att bara
> vara namn som de är i Scheme.
>
>
Det är väl en nackdel, inte en fördel?
>Och hur kraftfullt och användbart tror du att ett språk är som man kan
>lära sig helt på en vecka?
>
Jag tror att det är så in i helvete kraftfullt. Igen, exemplet med go vs
schack.
Jag tror inte att 6.001 (kursen "SICP" på MIT) skulle gå att göra på
samma tid med CL.