Проблемы доктора Ракета с SICP

Я работаю через SICP. В настоящее время в первой главе у меня проблемы с тем, чтобы Racket позволил мне переопределить «примитивы». Например, у меня сложилось впечатление, что я должен быть в состоянии сделать произвольно (определить + 5) , и это было бы хорошо, или переопределите процедуру sqrt . Вместо этого я получаю следующее:

define-values: cannot change constant variable: +

У меня сейчас установлен язык R5RS, и у меня сложилось впечатление, что он позаботится о проблемах совместимости с SICP.

30
задан Josh Infiesto 28 November 2017 в 06:07
поделиться

2 ответа

Даже если это возможно, такие переопределения не следует делать, не понимая, как на это отреагирует система. Например, если вы переопределите +, не сломается ли какой-либо другой код? Ответ на этот вопрос в случае Racket — «нет», но это потому, что вы на самом деле не можете переопределить +: вместо этого вы определяете новый +, который может использовать только ваш код.

Что касается выбора языка — режим Rackets R5RS очень строгий, и вы обычно не захотите его использовать. гораздо более дружественную к SICP среду можно найти на странице поддержки SICP Нила Ван Дайка, где вы найдете язык, специально созданный для этой книги. (IIRC, у него даже есть графический язык, который демонстрируется в книгах.)

35
ответ дан 27 November 2019 в 23:35
поделиться

В языковой панели нужно отключить "запретить переопределение исходных привязок". Это устраняет проблему.

11
ответ дан 27 November 2019 в 23:35
поделиться