PHP expert |
|
Hoi Sitemasters,
Ik probeer Scheme te leren. Scheme is een programmeertaal die niet veel lijkt op PHP, of andere C-based talen.
VB:
(display "hoi")
vs:
print("hoi")
En:
(if (< 10 15)
(display "10 is kleiner dan 15")
(display "10 is groter dan of gelijk aan 15"))
vs:
if(10 < 15)
{
print("10 kleiner dan 15");
}else
{
print("10 is groter dan of gelijk aan 15");
}
Zo'n programma's zien er vreemd uit in Scheme, maar dat komt omdat het in Scheme altijd zo gaat:
(functienaam parameter1 parameter2 ... parameterN)
En alles in Scheme gaat met functies, dus < en if zijn functies in Scheme. Je zou dus ook je eigen for en switch kunnen maken.
Dit lijkt me wel interessant omdat je dus zelf allerlei dingen aan de taal kunt toevoegen.
Maar het probleem is dat ik het niet begrijp
http://www.ccs....Z-H-1.html
Dat heb ik even snel doorgelezen, en ik snap het meeste, maar bij "macros" snap ik het niet meer... De eerste dingen snap ik nog wel, maar 8.3 fluid-let snap ik echt niet.
(define-macro fluid-let
(lambda (xexe . body)
(let ((xx (map car xexe))
(ee (map cadr xexe))
(old-xx (map (lambda (ig) (gensym)) xexe))
(result (gensym)))
`(let ,(map (lambda (old-x x) `(,old-x ,x))
old-xx xx)
,@(map (lambda (x e)
`(set! ,x ,e))
xx ee)
(let ((,result (begin ,@body)))
,@(map (lambda (x old-x)
`(set! ,x ,old-x))
xx old-xx)
,result)))))
(define-macro fluid-let (lambda (xexe . body) (let ((xx (map car xexe)) (ee (map cadr xexe)) (old-xx (map (lambda (ig) (gensym)) xexe)) (result (gensym))) `(let ,(map (lambda (old-x x) `(,old-x ,x)) old-xx xx) ,@(map (lambda (x e) `(set! ,x ,e)) xx ee) (let ((,result (begin ,@body))) ,@(map (lambda (x old-x) `(set! ,x ,old-x)) xx old-xx) ,result)))))
:o
Kan iemand die in Scheme kan programmeren me dit uitleggen? Volgens mij proberen ze een functie (macro) te maken om een eigen variabele scope te maken, zo ongeveer in php:
$a = 5;
// hier is $a 5
fluid_let(
$a = 10;
// hier is $a 10
);
//hier is $a weer 5
$a = 5; // hier is $a 5 fluid_let( $a = 10; // hier is $a 10 ); //hier is $a weer 5
Maar ik snap de code die dit mogelijk maakt niet.
Alvast bedankt voor de hulp,
Jules
|