2015-03-09 2 views
0

Кто-нибудь знает, что обоснование ограничения форм define должно появляться только в начале корпуса lambda (т. Е. Не допускать их после какой-либо другой формы, кроме другой define)? Для меня это кажется довольно произвольным и не позволяет писать более элегантный код. В частности, разрешение define в любом месте, по-видимому, устраняет необходимость в связанных формах let, что делает код более удобным для чтения. Еще одним преимуществом могло бы стать исчезновение таких форм, как (define x) (без какого-либо значения), которые требуют только более позднего set!, что объединит декларацию и инициализацию.Размещение «определить» внутри «лямбда» тел в схеме

+0

Мне любопытно, какую реализацию Схемы вы имеете в виду по этому вопросу? Я знаю, что Racket (включая его реализацию R5RS) позволяет использовать формы 'define' в любом месте в контексте внутреннего определения, разрешая чередование выражений. –

+0

Это стандарт, который это оговаривает. Да, я знаю, что существуют реализации, которые не соответствуют этому требованию (например, BiwaScheme). _ лямбда [...] состоит из нуля или более определений, за которыми следует одно или несколько выражений. "_ () '' define'' формы не являются выражениями. –

+0

Хм, вы правы ... просматривая спецификации, R [5-7] RS все определения мандатов находятся на вершине. это просто для того, чтобы позволить специфицировать все внутренние определения, эквивалентные простой форме 'letrec' (или' letrec * 'в 6 и 7). Это не выполняется, если вы разрешаете чередующиеся выражения и определения. –

ответ

0

Нет причин, по которым реализация не смогла бы поддержать это. например.

(define (fib x) 
    (define (fin-aux n a b) 
    (if (other-fun n) 
     a 
     (fib-aux (- n 1) b (+ a b)) 
    (fib-aux x 0 1) 
    (define (other-fun x) 
    (zero? x))) 

; transforms into ==> 
(define (fib x) 
    (letrec* ((fib-aux (lambda (n a b) ..)) 
      (other-fun (lambda (x) ...))) 
    (fib-aux x 0 1))) 

Это простая процедура. Представьте, что один с 10+ определяет. Это будет похоже на версию схемы Where's Wally?.

Когда я узнал Java в 90-х, мне сказали положить все переменные в нижней части класса, потому что это сделало код более понятным для профессора. Я не делаю этого сегодня, но этот вопрос sorta заставил меня задуматься о том, как трудно было читать код, который ссылался на переменные класса, которые я еще не видел. Если размещение выражения было вопросом вкуса, было бы труднее прочитать Схему.

+0

Технически я не думаю, что преобразование всегда было бы эквивалентным. Рассмотрим нефункциональное определение с побочными эффектами: '(define x (displayln" hello ")'. Если другие выражения в функции также имеют побочные эффекты, переупорядочение станет очевидным. –

+0

@AlexisKing В R5RS порядок оценки не определен, поэтому порядок побочных эффектов не указан. В R6RS вам гарантированно порядок, но все 'define' становятся частью того же' letrec *' сегодня. Возможно, ограничение гарантирует, что вы получите побочные эффекты в том же порядке, что и код? – Sylwester

Смежные вопросы