Почему я могу определить новый cond, и Scheme не запутается с моим новым cond из-за условного cond?
У меня есть эта задача, где я работаю с метациклическим оценщиком, и я определяю новый cond
как это:
(define cond 3)
Так же как else
:
(define (else x) (/ x 2)
Мой вопрос: почему это (ниже) на самом деле работает?
(cond ((= cond 2) 0)
(else (else 4)))
Как Схема знает, какой cond
мой определенный cond и мой else
, по условному cond
а также else
?
(Не стесняйтесь редактировать заголовок, так как я не уверен, как сформулировать свой вопрос)
2 ответа
Это зависит от того, как вы реализовали cond
в метациркуляционном оценщике. Обычно он проверяет некоторые операторы на символы, такие как quote
а также cond
а затем сделать что-то особенное. таким образом cond
в положении оператора будет расширен как cond
в то время как cond
в других обстоятельствах будет оцениваться, как если бы это была переменная.
В Схеме нет зарезервированных идентификаторов. Во многих языках есть список зарезервированных идентификаторов (ключевых слов), которые нельзя использовать в качестве имен переменных.
В Схеме вы можете, например, сделать это:
> (let ((cond +))
(cond 1 2))
3
Что отличает Scheme от большинства языков, так это то, что программы расширяются макросами.
Запуск программы Scheme:
read -> macro expansion -> compilation -> execution
Нетривиально объяснить, как работает алгоритм расширения макроса. Я могу порекомендовать главу "Кентакс Дибвиг" в главе "Красивый код" главу "Синтаксическая абстракция: расширитель падежей синтаксиса".