Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lisp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
rdt
186 / 153 / 17
Регистрация: 18.12.2015
Сообщений: 179
1

"#lang planet neil/sicp", ошибка: "define: not allowed in an expression context."

02.10.2016, 12:05. Просмотров 846. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2016, 12:05
Ответы с готовыми решениями:

Ошибка " should be a lambda expression "
Привет всем. Я написал код на Common Lisp который должен выводить элементы...

Данo ориентированный граф произвольно. удалитe узел " i" вместе сo всеми узлами , которые доступны из "i".
Данo ориентированный граф произвольно. удалитe узел &quot; i&quot; вместе сo ...

В зависимости от введенного с клавиатуры числа вывести на экран строку "Чётное число"/"Нечётное число"
В зависимости от введенного с клавиатуры числа вывести на экран строку &quot;Чётное...

Взаимные преобразования "Матрица смежности" <-> "Матрица инцидентности"
Вершины неорентированного графа без петель пронумерованы числами от 0 до...

Непонятная ошибка (SAVEINITMEM "base/lispinit.mem) is not a number")
Здравствуйте. Пишу курсовую на тему &quot;Численное интегрирование функции методом...

4
helter
Эксперт по математике/физике
3793 / 2815 / 307
Регистрация: 12.03.2013
Сообщений: 5,156
02.10.2016, 16:30 2
Лучший ответ Сообщение было отмечено rdt как решение

Решение

По R5RS define можно писать не везде. Можно на верхнем уровне, в начале определения функции и, более общо, в начале <body>, как говорит сам R5RS:
https://wiki.call-cc.org/man/4/The%20R5RS%20standard#definitions
Вообще, для локальных определений специально созданы let и letrec, и не очень понятно, почему в SICPе так много внутренних defin'ов.
2
rdt
186 / 153 / 17
Регистрация: 18.12.2015
Сообщений: 179
02.10.2016, 17:03  [ТС] 3
helter, тогда логика, вроде, понятна: "define" пишется в самом начале блока, чтоб оно работало как будто я описал переменную с помощью "let" перед этим блоком.

А раз так, я, просто, напишу "let": буду считать, что автор забыл познакомить меня с этим оператором (я запустил поиск, "let" впервые встречается в пункте 1.3.2), а я, как бы, исправляю его недоработку.
0
rdt
186 / 153 / 17
Регистрация: 18.12.2015
Сообщений: 179
03.10.2016, 22:17  [ТС] 4
Цитата Сообщение от rdt Посмотреть сообщение
зачем надо действовать по второму способу?
Так вот чего от меня хотели: "Выражение с let — это всего лишь синтаксический сахар для вызова lambda."

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

Интересный подход в этой книжке.
0
korvin_
2206 / 1696 / 324
Регистрация: 28.04.2012
Сообщений: 6,003
04.10.2016, 19:06 5
Цитата Сообщение от helter Посмотреть сообщение
не очень понятно, почему в SICPе так много внутренних defin'ов
Потому что меньше скобок и вложенности.
0
04.10.2016, 19:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2016, 19:06

Ошибка "A comma appears outside the scope of a backquote"
Привет всем! Мне нужно определить форму (IF условие p q) в виде макроса....

Задача из раздела "С для начинающих" - обработка текстового файла
Вот такая задача была опубликована в разделе &quot;С для начинающих&quot;: В конец...

Разработать справочно-информационную систему "справочная система авиакомпании"
Здравствуйте! Помогите, пожалуйста, разработать справочно-информационную...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru