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/... а_—_Рабина ):

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#lang planet neil/sicp
 
(define (wiki-mr-prime? n)
 (define (stfun s t)
  (if (even? t)
   (stfun (1+ s) (/ t 2))
   (list s t)
 ))
 (cond
  ((<= n 0) nil)
  ((= n 1) #f)
  ((even? n) #f)
  ((= n 3) #t)
  (else
   (define st (stfun 0 (1- n)))
   (display (list n st))
)))
Просто ввожу этот код и получаю сообщение об ошибке:

"define: not allowed in an expression context in: (define st (stfun 0 (1- n)))"

Если в первой строке написать "#lang racket", то сообщения об ошибке не появляется.

Вопрос: что я делаю не так с точки зрения авторов книги?

Чтоб повторно использовать значение выражения, я должен куда-то сохранить результат. Пройденный материал (я дошёл до параграфа 1.2) предлагает 2 варианта:
1) использовать define;
2) написать ещё одну функцию, и передать туда данные в качестве параметра.

Первый способ, по непонятной для меня причине, не сработал. А второй - чуть более трудоёмок. Хотелось бы знать, почему первый способ не сработал; и, что более важно, зачем надо действовать по второму способу?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2016, 12:05
Ответы с готовыми решениями:

Ошибка: Function definition is not allowed here и Expected expression среда xCode forMacOS
Не могу устранить ошибки. Что я сделал не так? ссылка на скрин ошибки1, и ошибки2 #include...

View pattern in expression context
import Data.List ( groupBy, intercalate, sortBy ) showTerm :: (Ord a, Num a, Num b, Show a, Show...

Fatal error: Cannot use temporary expression in write context
Fatal error: Cannot use temporary expression in write context in...

Error: Could not find or load main class planet.Planet
Запускаю программу и выдает вот такую ошибку &quot;Error: Could not find or load main class...

4
4527 / 3521 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
02.10.2016, 16:30 2
Лучший ответ Сообщение было отмечено rdt как решение

Решение

По 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
Цитата Сообщение от rdt Посмотреть сообщение
зачем надо действовать по второму способу?
Так вот чего от меня хотели: "Выражение с let — это всего лишь синтаксический сахар для вызова lambda."

Я должен был с помощью "define" ввести новую функцию, а они потом бы объяснили, что для новой функции тут достаточно "lambda", а использование "lambda", в данном случае, можно заменить на использование "let".

Интересный подход в этой книжке.
0
Эксперт функциональных языков программированияЭксперт Java
4467 / 2701 / 484
Регистрация: 28.04.2012
Сообщений: 8,559
04.10.2016, 19:06 5
Цитата Сообщение от helter Посмотреть сообщение
не очень понятно, почему в SICPе так много внутренних defin'ов
Потому что меньше скобок и вложенности.
0
04.10.2016, 19:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.10.2016, 19:06
Помогаю со студенческими работами здесь

Скрытие столбцов. Ошибка App-define od obj-define error
Привет) помогите, пожалуйста, ответить на следующие вопросы: 1) выскакивает ошибка: App-define...

Error: Element ul not allowed as child of element ul in this context. (Suppressing further errors from this subtree.)
&lt;!DOCTYPE html&gt; &lt;html lang=&quot;en&quot;&gt; &lt;head&gt; &lt;meta charset=&quot;UTF-8&quot;&gt; &lt;meta...

Не понимаю, как исправить ошибку: 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
При нажатии на текст (любой) лог не выводится, а выдает ошибку Что выдает Logcat: 2021-11-18...

Валидатор выдает ошибку Error: Element menu not allowed as child of element header in this context. (Suppressing further
&lt;header&gt; &lt;menu&gt; &lt;/menu&gt; &lt;/header&gt; Тоже самое если ставлю menu в body.В...

ошибка Method Not Allowed, The requested method POST is not allowed for the URL /form.html.
Установил Apache сервер, ActivePerl-5.8.1.807-MSWin32, а в моей пробной страничке при нажатия на...

Ошибка java.lang.ClassCastException: [F cannot be cast to [Ljava.lang.Object
Здравствуйте! Использую библиотеку с открытым кодом JGraphX (http://www.jgraph.com/) для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru