Какой пакет lang подходит для SICP в Dr.Racket?

Я пытаюсь с SICP, и у меня есть код. Поэтому я начал с:

#lang scheme
(word 'comp 'uter)

Возвращенная ошибка: Функция (слово) undefined.

Даже если я попытался скопировать это в IDE (Run):

(define word?
  (let ((number? number?)
        (symbol? symbol?)
        (string? string?))
    (lambda (x)
      (or (symbol? x) (number? x) (string? x)))))

То же самое.

Я думаю, что это может быть определенная проблема с версией языка или иначе.


Выше приведены "Просто схема", и когда я вводил код именно в SICP:

(define (sqrt x)
    (sqrt-iter 1.0 x))

IDE возвращен sqrt-iter undefined. Код можно найти в первой главе: http://mitpress.mit.edu/sicp/code/index.html

Ответы

Ответ 1

В DrRacket есть язык совместимости SICP

1. В диспетчере пакетов

В документации есть простое руководство по его установке из DrRacket:

  • Откройте диспетчер пакетов: в DrRacket выберите меню "Файл", затем выберите "Менеджер пакетов...".

  • На вкладке "Do What я Mean" найдите текстовое поле и введите: "sicp"

  • Нажмите кнопку "Установить". Это дает много результатов. Не беспокойтесь об этом, даже когда есть предупреждения.

  • Проверьте его. Убедитесь, что DrRacket имеет "Определить язык из источника" в нижний левый угол. Напишите следующую программу и нажмите RUN:

    #lang sicp 
    
    (inc 42) 
    ; ==> 43
    

Вот более продвинутый тест, в котором используется язык изображения, который должен быть включен в #%require:

#lang sicp
(#%require sicp-pict)

(paint-hires  (below (beside diagonal-shading
                             (rotate90 diagonal-shading))
                     (beside (rotate270 diagonal-shading)
                             (rotate180 diagonal-shading))))

Нажмите RUN, и вы увидите квадрат в окне взаимодействия, который станет ярче по направлению к центру.

2 Установка командной строки

В качестве альтернативы вы также можете сделать шаг 1-3 из терминала/оболочки, выполнив следующее:

raco pkg install sicp

Отсюда вы выполните шаг 4. в первой инструкции по установке, чтобы проверить его.

3. Старые версии или DrRacket, использующие планету, если raco pkg не работал

В DrRacket существует также старая версия языка совместимости SICP. Имея нижний левый поле выбора в поле "Определить язык из источника", вы можете просто добавить:

#lang planet neil/sicp

как единственная строка в определениях (верхняя область текста) и нажмите RUN, и она будет установлена. Перезагрузите DrRacket, и вы найдете его доступным в раскрывающемся списке. Удачи. Вы можете получить много сообщений об ошибках красным цветом. Просто проигнорируйте его и перезапустите DrRacket. Возможно, вы больше не найдете выбор в языковом меню, но, начав каждый файл с помощью #lang planet neil/sicp, он по-прежнему работает как язык модуля.

Судя по ошибкам, он, по-видимому, относится к модулю языка изображения. Я тестировал этот снайпер, и он все еще работает:

(paint-hires  (below (beside diagonal-shading
                             (rotate90 diagonal-shading))
                     (beside (rotate270 diagonal-shading)
                             (rotate180 diagonal-shading))))

Ответ 2

Ответ Sylwester был тем, что я хотел. Однако я заметил, что Racket 6.5 имеет добавлена ​​прямая поддержка SICP. Я думаю, что люди могут это знать.

Теперь в Racket можно записать код, как показано ниже, после добавления поддержки SICP:

#lang sicp
(#%require sicp-pict)
(paint einstein)

Ответ 3

[Хороший старт; продолжай, тебе понравится Схема!]

В схеме программы разрабатываются в среде. Окружение определяет сопоставление от идентификаторов к значениям. Некоторые из значений - это функции, некоторые - числа и т.д. Когда вы определите функцию:

(define (sqrt x)
  (sqrt-iter 1.0 x))

идентификатор x привязан как аргумент к sqrt, значение 1.0 является числом, а идентификатор sqrt-iter исходит из среды.

Вопрос, который задают себе, - "где определено sqrt-iter, с чем он связан?" Поскольку он не определен вами, sqrt-iter должен происходить из среды, встроенной в вашу схему или импортированной в вашу схему. Вы ничего не импортировали, а sqrt-iter не определен в Схеме (см. Ресурсы для R5RS или других). Таким образом, sqrt-iter несвязано.

Такая же логика применяется к каждому идентификатору, включая использование word.

В вашей реализации word? синтаксическое ключевое слово let используется для введения новых связанных идентификаторов. Когда вы пишете (number? number?), вы вводите новый идентификатор number? (слева) и привязываете его к number? (справа), исходящему из среды (он определен в Схеме). Использование let для этого на самом деле ничего не покупает. Ваш код для word? может быть реализован как:

(define (word? x)
  (or (symbol? x) (number? x) (string? x)))   ;; number?