Почему этот код не работает в схеме? - PullRequest
1 голос
/ 19 ноября 2008
 (define a 42)
 (set! 'a 10)


(define a 42)
(define (symbol) 'a)
(set! (symbol) 10)


(define a (cons 1 2))
(set! (car a) 10)

Я пытался запустить их в DrScheme, и они не работают. Почему?

Ответы [ 3 ]

3 голосов
/ 19 ноября 2008

Думай о множестве! это специальная форма типа define, которая не оценивает свой первый операнд. Вы говорите интерпретатору схемы установить эту переменную именно так, как вы пишете. В вашем примере он не будет вычислять выражение «a к слову a. Вместо этого он будет искать привязку переменной с именем «a» (или в зависимости от того, что ваш интерпретатор может просто сломать раньше, так как я думаю, что «a» не является допустимой привязкой).

Для последнего набора выражений, если вы хотите установить автомобиль пары, используйте функцию (set-car! Pair val), которая работает так же, как любая функция схемы, в которой она оценивает все свои операнды. Он принимает два значения, пару и некоторое значение схемы, и изменяет пару так, что автомобиль теперь указывает на значение схемы.

Так, например.

>(define pair (cons 1 2))
>pair
(1 . 2)
>(set-car! pair 3)
(3 . 2)
2 голосов
/ 19 ноября 2008

Потому что первый аргумент множества! это имя переменной, а не lvalue, так сказать.

В последнем случае используйте (set-car! A 10).

0 голосов
/ 19 ноября 2008

Проблема связана с (установите! 'A 10) , так как вам не следует указывать символ a .

Звучит так, будто ты пытаешься выучить Схему, и ты не знаешь Лисп, да? Если это так, я настоятельно рекомендую попробовать Clojure как более легкий для изучения Lisp. Мне не удалось понять взаимодействие между читателем, оценкой, символами, специальными формами, макросами и т. Д. Как в Common Lisp, так и в Scheme, потому что все эти вещи, казалось, взаимодействовали запутанными способами, но я наконец-то понял их в Clojure. Несмотря на то, что он новый, я обнаружил, что документация Clojure на самом деле более ясна, чем все, что я нашел для Scheme или CL. Начните с видео на http://clojure.blip.tv/, а затем прочитайте документы на clojure.org.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...