Я работаю через SICP. В настоящее время в первой главе у меня проблемы с тем, чтобы Racket позволил мне переопределить «примитивы». Например, у меня сложилось впечатление, что я должен быть в состоянии сделать произвольно (определить + 5)
, и это было бы хорошо, или переопределите процедуру sqrt
. Вместо этого я получаю следующее:
define-values: cannot change constant variable: +
У меня сейчас установлен язык R5RS, и у меня сложилось впечатление, что он позаботится о проблемах совместимости с SICP.
Даже если это возможно, такие переопределения не следует делать, не понимая, как на это отреагирует система. Например, если вы переопределите +
, не сломается ли какой-либо другой код? Ответ на этот вопрос в случае Racket — «нет», но это потому, что вы на самом деле не можете переопределить +
: вместо этого вы определяете новый +
, который может использовать только ваш код.
Что касается выбора языка — режим Rackets R5RS очень строгий, и вы обычно не захотите его использовать. гораздо более дружественную к SICP среду можно найти на странице поддержки SICP Нила Ван Дайка, где вы найдете язык, специально созданный для этой книги. (IIRC, у него даже есть графический язык, который демонстрируется в книгах.)
В языковой панели нужно отключить "запретить переопределение исходных привязок". Это устраняет проблему.