В чем разница между let, let* и letrec?
Пожалуйста, дайте подробные пояснения и примеры.
В чем разница между let, let* и letrec?
Пожалуйста, дайте подробные пояснения и примеры.
Лучше всего прочитать официальные описания R5RS let
, let*
и letrec
.
Короче, однако:
(let ((x 2))
(let ((x 3) (y x))
y) => 2
(let ((x 2))
(let* ((x 3) (y x))
y) => 3
Таким образом, разница между let
и let*
заключается в том, что let
будет оценивать все привязки относительно уровня выше (поэтому не имеет значения, в каком порядке они перечислены), а let*
делает это последовательно. (let* ((x a) (b y)))
эквивалентно (let ((x a)) (let ((b y)))
.
letrec
, с другой стороны, позволяет привязывать рекурсивные значения. Таким образом, вы можете написать рекурсивную функцию, которая должна находиться только в пределах области действия функции, и связать ее с именем, используя letrec
.