188 / 155 / 17
Регистрация: 18.12.2015
Сообщений: 179
|
||||||
1 | ||||||
"#lang planet neil/sicp", ошибка: "define: not allowed in an expression context."02.10.2016, 12:05. Показов 1998. Ответов 4
Метки нет Все метки)
(
Пробую решать задачи из SICP на Racket. В какой-то момент код из книжки не заработал, и я стал добавлять "#lang planet neil/sicp". Теперь код из книжки обрабатывается корректно, но то, что я пишу периодически натыкается на одну и ту же ошибку.
Вот пример кода, вызывающего ошибку (самое начало написания теста Миллера-Рабина в той формулировки, которая дана в википедии https://ru.wikipedia.org/wiki/... а_—_Рабина ):
"define: not allowed in an expression context in: (define st (stfun 0 (1- n)))" Если в первой строке написать "#lang racket", то сообщения об ошибке не появляется. Вопрос: что я делаю не так с точки зрения авторов книги? Чтоб повторно использовать значение выражения, я должен куда-то сохранить результат. Пройденный материал (я дошёл до параграфа 1.2) предлагает 2 варианта: 1) использовать define; 2) написать ещё одну функцию, и передать туда данные в качестве параметра. Первый способ, по непонятной для меня причине, не сработал. А второй - чуть более трудоёмок. Хотелось бы знать, почему первый способ не сработал; и, что более важно, зачем надо действовать по второму способу?
0
|
|
02.10.2016, 12:05 | |
Ответы с готовыми решениями:
4
View pattern in expression context Fatal error: Cannot use temporary expression in write context Error: Could not find or load main class planet.Planet |
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
|
|
02.10.2016, 16:30 | 2 |
![]() Решение
По R5RS define можно писать не везде. Можно на верхнем уровне, в начале определения функции и, более общо, в начале <body>, как говорит сам R5RS:
https://wiki.call-cc.org/man/4... efinitions Вообще, для локальных определений специально созданы let и letrec, и не очень понятно, почему в SICPе так много внутренних defin'ов.
2
|
188 / 155 / 17
Регистрация: 18.12.2015
Сообщений: 179
|
|
02.10.2016, 17:03 [ТС] | 3 |
helter, тогда логика, вроде, понятна: "define" пишется в самом начале блока, чтоб оно работало как будто я описал переменную с помощью "let" перед этим блоком.
А раз так, я, просто, напишу "let": буду считать, что автор забыл познакомить меня с этим оператором (я запустил поиск, "let" впервые встречается в пункте 1.3.2), а я, как бы, исправляю его недоработку. ![]()
0
|
188 / 155 / 17
Регистрация: 18.12.2015
Сообщений: 179
|
|
03.10.2016, 22:17 [ТС] | 4 |
Так вот чего от меня хотели: "Выражение с let — это всего лишь синтаксический сахар для вызова lambda."
Я должен был с помощью "define" ввести новую функцию, а они потом бы объяснили, что для новой функции тут достаточно "lambda", а использование "lambda", в данном случае, можно заменить на использование "let". Интересный подход в этой книжке.
0
|
![]() ![]() 4467 / 2701 / 484
Регистрация: 28.04.2012
Сообщений: 8,559
|
|
04.10.2016, 19:06 | 5 |
0
|
04.10.2016, 19:06 | |
04.10.2016, 19:06 | |
Помогаю со студенческими работами здесь
5
Скрытие столбцов. Ошибка App-define od obj-define error
Не понимаю, как исправить ошибку: Element dd not allowed as child of element li in this context java.lang.IllegalStateException: Could not find method lesson1go(View) in a parent or ancestor Context for android:onCli Валидатор выдает ошибку Error: Element menu not allowed as child of element header in this context. (Suppressing further ошибка Method Not Allowed, The requested method POST is not allowed for the URL /form.html. Ошибка java.lang.ClassCastException: [F cannot be cast to [Ljava.lang.Object Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |