Кто-нибудь знает, что обоснование ограничения форм define
должно появляться только в начале корпуса lambda
(т. Е. Не допускать их после какой-либо другой формы, кроме другой define
)? Для меня это кажется довольно произвольным и не позволяет писать более элегантный код. В частности, разрешение define
в любом месте, по-видимому, устраняет необходимость в связанных формах let
, что делает код более удобным для чтения. Еще одним преимуществом могло бы стать исчезновение таких форм, как (define x)
(без какого-либо значения), которые требуют только более позднего set!
, что объединит декларацию и инициализацию.Размещение «определить» внутри «лямбда» тел в схеме
ответ
Нет причин, по которым реализация не смогла бы поддержать это. например.
(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 заставил меня задуматься о том, как трудно было читать код, который ссылался на переменные класса, которые я еще не видел. Если размещение выражения было вопросом вкуса, было бы труднее прочитать Схему.
Технически я не думаю, что преобразование всегда было бы эквивалентным. Рассмотрим нефункциональное определение с побочными эффектами: '(define x (displayln" hello ")'. Если другие выражения в функции также имеют побочные эффекты, переупорядочение станет очевидным. –
@AlexisKing В R5RS порядок оценки не определен, поэтому порядок побочных эффектов не указан. В R6RS вам гарантированно порядок, но все 'define' становятся частью того же' letrec *' сегодня. Возможно, ограничение гарантирует, что вы получите побочные эффекты в том же порядке, что и код? – Sylwester
- 1. Вложенный лямбда в схеме
- 2. Вложенные Лямбда в схеме?
- 3. Устранить лямбда в схеме?
- 4. выражение Карта + лямбда в схеме
- 5. если заявление в лямбда-схеме
- 6. Объяснение выражения лямбда в схеме
- 7. Использование переменных let в схеме лямбда в схеме
- 8. Как определить функцию лямбда внутри функции?
- 9. Реализация лямбда-заявления на схеме?
- 10. новообращенный впустили в лямбда в схеме
- 11. Лямбда внутри лямбда
- 12. Получение ошибки при интерпретации лямбда в схеме
- 13. с помощью лямбда вместо впустить в схеме
- 14. лямбда-функции и памяти в схеме
- 15. По умолчанию аргумент в схеме лямбда-функции?
- 16. Как использовать foldr и лямбда в схеме?
- 17. Пытаясь понять это лямбда-выражение в схеме
- 18. Лямбда выражения как монады в схеме?
- 19. как определить последний в схеме?
- 20. Я могу определить шаблонную функцию внутри лямбда в Visual Studio
- 21. HTML проверка - Сайт не действует при использовании тел внутри HREF
- 22. Каков прецедент применения функций функций внутри тел?
- 23. Зачем допускать объявления функций внутри тел функций
- 24. Счетчик внутри процедуры в схеме
- 25. Размещение Div внутри div
- 26. Размещение словаря внутри Viewbag
- 27. Размещение изображения внутри div
- 28. размещение изображения внутри панели
- 29. Размещение изображения внутри div
- 30. Размещение миниатюр внутри вкладок
Мне любопытно, какую реализацию Схемы вы имеете в виду по этому вопросу? Я знаю, что Racket (включая его реализацию R5RS) позволяет использовать формы 'define' в любом месте в контексте внутреннего определения, разрешая чередование выражений. –
Это стандарт, который это оговаривает. Да, я знаю, что существуют реализации, которые не соответствуют этому требованию (например, BiwaScheme). _
лямбда [...] состоит из нуля или более определений, за которыми следует одно или несколько выражений. "_ (Хм, вы правы ... просматривая спецификации, R [5-7] RS все определения мандатов находятся на вершине. это просто для того, чтобы позволить специфицировать все внутренние определения, эквивалентные простой форме 'letrec' (или' letrec * 'в 6 и 7). Это не выполняется, если вы разрешаете чередующиеся выражения и определения. –