> 1 <

Автор Сообщение

rv82

Members


Статус

46 сообщений
http://rv82.ya.ru
Где: Russia
Род занятий:
Возраст:

#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

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#6176   2012-05-24 21:34 GMT+3 часа(ов)      
Цитата
Получается, если такая запись корректна, то использовать повсеместно let не обязательно?

Да, корректна, да, не обязательна. Но внутренние define имеют семантику letrec* - надо это учитывать.

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#6181   2012-05-25 00:16 GMT+3 часа(ов)      
Цитата
Получается, если такая запись корректна, то использовать повсеместно let не обязательно?
Некоторые интерпретаторы не позволяют использовать define в теле функции, поэтому для совместимости с ними лучше использовать let.
Код для размышления:
(define (f a)
(display (+ a 2))
(define a 45)
a)
С первого взгляда код корректен, но его интерпретация может быть для вас неожиданной.

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#6182   2012-05-25 14:00 GMT+3 часа(ов)      
Цитата
Некоторые интерпретаторы не позволяют использовать define в теле функции, поэтому для совместимости с ними лучше использовать let.

Тогда эти интерпретаторы нарушают стандарт.

Цитата
С первого взгляда код корректен, но его интерпретация может быть для вас неожиданной.

В стандарте четко сказано, что internal definitions имеют letrec* семантику. Ничего неожиданного быть не должно. и все дефайны должны идти сверху.

отредактировал(а) Kergan: 2012-05-25 14:08 GMT+3 часа(ов)

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#6184   2012-05-25 21:34 GMT+3 часа(ов)      
Цитата
Тогда эти интерпретаторы нарушают стандарт.
Многие интерпретаторы нарушают стандарт.
Цитата
В стандарте четко сказано, что internal definitions имеют letrec* семантику.
1) letrec* появился только с r6rs.
2) В стандарте сказано, что код, содержащий internal definitions, всегда можно переписать в эквивалентный ему, используя letrec(letrec*). Про "internal definitions имеют letrec* семантику" ни слова.
Цитата
Ничего неожиданного быть не должно.
Я обращался к rv82.
Цитата
и все дефайны должны идти сверху.
Это относится как к функции, так и к аналогам let-а. Этого требует синтаксис. Поэтому реализация, четко выполняющая требования стандарта, должна выдать синтаксическую ошибку для приведенного выше фрагмента кода.

rv82

Members


Статус

46 сообщений
http://rv82.ya.ru
Где: Russia
Род занятий:
Возраст:

#6186   2012-05-26 09:15 GMT+3 часа(ов)      
Спасибо за комментарии! Буду, как и раньше, пользоваться let'ами. Кстати, позавчера пробовал написать простенькую программку с функцией, содержащей вложенную функцию. Racket выдал ошибку. Если же эту вложенную функцию вытащить наружу, то ошибок не было.
> 1 <


Онлайн :

0 пользователь(ей), 12 гость(ей) :




Реклама на сайте: