Один пример в SICP

Это пример в SICP, я его ввожу но там ошибка.

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))

Это ошибка:

вызов функции: ожидал функцию после открывающей скобки, но нашел переменную


person Jerry Zhao    schedule 08.10.2012    source источник
comment
Вы получаете эту ошибку, когда пытаетесь определить функцию или когда пытаетесь ее запустить? Если это когда вы пытаетесь запустить его, покажите, что вы печатаете.   -  person Barmar    schedule 08.10.2012
comment
Это почти наверняка связано с тем, что DrRacket находится в режиме языка для начинающих студентов (BSL): он рассматривает приведенный выше код как синтаксическую ошибку времени компиляции, поскольку предполагается, что учащийся еще не должен использовать функции более высокого порядка.   -  person dyoo    schedule 08.10.2012


Ответы (2)


Если вы используете DrRacket, возможно, вы используете DrRacket в режиме «Язык для начинающих». На начальном уровне CS этот конкретный режим языкового уровня отключает функции более высокого порядка. SICP, с другой стороны, предполагает уровень языка, позволяющий выполнять процедуры более высокого порядка.

Предполагая, что это так, вы можете исправить это, настроив DrRacket так, чтобы он использовал языковой уровень, позволяющий выполнять процедуры более высокого порядка, такие как #lang рэкет.

См. Выбор языка: переключите DrRacket на "Использовать язык, указанный в источник", и сделайте верхнюю строку вашей программы:

#lang racket

Это должно позволить вам написать свою функцию.


Кстати есть специализированная поддержка SICP для DrRacket; если вы собираетесь пройти SICP, вы, вероятно, захотите использовать это. Вы можете включить эту поддержку, изменив верхнюю строку #lang на:

#lang planet neil/sicp

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

person dyoo    schedule 08.10.2012
comment
Текущая ссылка на поддержку SICP в DrRacket: docs.racket-lang.org/sicp- руководство/index.html - person Tim; 18.09.2016

Я считаю, что есть проблема с тем, как вы вызываете процедуру. Например, это отлично работает с приведенным выше кодом:

(sum values 1 add1 10)
> 55
person Óscar López    schedule 08.10.2012