> 1 <
Автор | Сообщение |
rv82
46 сообщений |
#6171 2012-05-23 13:18 GMT+3 часа(ов) |
Здравствуйте! Возможно, вопрос до глупости прост, но всё же... Корректно ли определять локальные переменные в функциях с помощью define? Я всегда использовал для этого let:
(define (sum a b) (let ([t (+ a b)] t))) Пример конечно простейший, зато понятно о чём речь ![]() Так вот, на различных ресурсах часто можно встретить инструкцию define: (define (sum a b) (define t (+ a b)) t) ; в итоге, скобок значительно меньше ![]() Получается, если такая запись корректна, то использовать повсеместно let не обязательно? Даже не знаю, с чего я взял когда-то, что внутри функций нельзя использовать define. |
|
Kergan
300 сообщений |
#6176 2012-05-24 21:34 GMT+3 часа(ов) |
Цитата Да, корректна, да, не обязательна. Но внутренние define имеют семантику letrec* - надо это учитывать. |
|
misha![]()
1275 сообщений |
#6181 2012-05-25 00:16 GMT+3 часа(ов) |
ЦитатаНекоторые интерпретаторы не позволяют использовать define в теле функции, поэтому для совместимости с ними лучше использовать let. Код для размышления: (define (f a)С первого взгляда код корректен, но его интерпретация может быть для вас неожиданной. |
|
Kergan
300 сообщений |
#6182 2012-05-25 14:00 GMT+3 часа(ов) |
Цитата Тогда эти интерпретаторы нарушают стандарт. Цитата В стандарте четко сказано, что internal definitions имеют letrec* семантику. Ничего неожиданного быть не должно. и все дефайны должны идти сверху. отредактировал(а) Kergan: 2012-05-25 14:08 GMT+3 часа(ов) |
|
misha![]()
1275 сообщений |
#6184 2012-05-25 21:34 GMT+3 часа(ов) |
ЦитатаМногие интерпретаторы нарушают стандарт. Цитата1) letrec* появился только с r6rs. 2) В стандарте сказано, что код, содержащий internal definitions, всегда можно переписать в эквивалентный ему, используя letrec(letrec*). Про "internal definitions имеют letrec* семантику" ни слова. ЦитатаЯ обращался к rv82. ЦитатаЭто относится как к функции, так и к аналогам let-а. Этого требует синтаксис. Поэтому реализация, четко выполняющая требования стандарта, должна выдать синтаксическую ошибку для приведенного выше фрагмента кода. |
|
rv82
46 сообщений |
#6186 2012-05-26 09:15 GMT+3 часа(ов) |
Спасибо за комментарии! Буду, как и раньше, пользоваться let'ами. Кстати, позавчера пробовал написать простенькую программку с функцией, содержащей вложенную функцию. Racket выдал ошибку. Если же эту вложенную функцию вытащить наружу, то ошибок не было.
|
|
> 1 <