В статье Fixing Letrec: A Faithful Yet Efficient Implementation of Scheme’s Recursive Binding Construct автор Dybvig et al. он говорит, что (курсив мой):Почему не letrec как исправить?
Теоретическое решение этих проблем является ограничение
letrec
так , что его левая стороны Unassigned и правая стороныlambda
выражения. Мы рассматриваем этот видletrec
какfix
, так как он составляет обобщенный вид оператора фиксированной точки. Компилятор может обрабатыватьfix
выражения эффективно, и не может быть никаких нарушений вletrec
ограничение сfix
. К сожалению, ограничениеletrec
таким образом не является вариантом для разработчика и в любом случае уменьшит общность и удобство конструкции.
я не всматривался в отчете R5RS, но я использовал letrec
и эквивалент «имя let
» в программах Scheme и неблагоприятных последствиях, указанных в статье не ясен для меня, кто-то может просветить меня?
Итак, по общности/потери удобства, это просто означало, что если вы ограничиваете себя лямбдами на RHS, вы не можете делать что-то вроде: (letrec ((x 3) (y (f 4)) (z (lambda (ab) ...)) (zxy)) – Rhangaun
@Skeptic да, именно потому, что вы ссылаетесь на неопределенный (h ere) переменная 'f', которая поэтому должна определяться в некоторой внешней области; и он не находится внутри какого-либо лямбда-выражения. И даже просто значение «3». –
Но это только потому, что стандарт требует проверки того, что переменные RHS не используются до ввода тела, если мы потеряем эту способность, мы можем иметь как lambdas, так и простые выражения в letrec, реализованные без набора! правильно ? – Rhangaun