Почему я могу определить новый 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

Нетривиально объяснить, как работает алгоритм расширения макроса. Я могу порекомендовать главу "Кентакс Дибвиг" в главе "Красивый код" главу "Синтаксическая абстракция: расширитель падежей синтаксиса".

https://www.cs.indiana.edu/~dyb/pubs/bc-syntax-case.pdf

Другие вопросы по тегам