Понимание символов на схеме - PullRequest
0 голосов
/ 09 ноября 2018

Можете ли вы помочь мне понять, почему в значении следующего выражения есть 7 символов (включая дубликаты)?

​'('a ',(string->symbol "b") 'c))

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

'('a ',(string->symbol "b") 'c)) имеет следующую структуру:

((quote a) 
 (quote (unquote (string->symbol "b"))) 
 (quote c))

Я могу сосчитать 7, так что да. Это 7 символов в результате вычисления цитируемого выражения.

В системе схем есть считыватель, который переводит 'x в (quote x) и ,, `, а ,@ соответствует формам с quasiquote, unquote и unquote-splicing. Это означает, что код `(a b c ,d e f) становится (quasiquote (a b c (unquote d) e f)). Затем макросы в реализации переводят его в (list* 'a 'b 'c d '(e f)) или аналогичное выражение, которое делает то же самое. Однако с '`(a b c ,d e f) просто становится значение (quasiquote (a b c (unquote d) e f)), так как это выражение, которое было заключено в кавычки. Схема не расширяется в обычное выражение кавычки.

Обычно символы в кавычках внутри указанных данных являются ошибкой. Начинающие не понимают цели и тонкие должны быть везде. Но на самом деле вам нужна только внешняя цитата. (+ 4 5) равно 9 и '(+ 4 5) равно (+ 4 5). Видишь разницу?

0 голосов
/ 10 ноября 2018

Вы можете написать функцию, которая проверяет, являются ли элементы символами.
Соедините элемент с его «символикой» для ясности:

(define (sym-check ls)
  (cond ((null? ls) '())
        ((not (pair? ls)) (cons ls (symbol? ls)))
        ((pair? (car ls)) (cons (map sym-check (car ls)) (sym-check (cdr ls))))
        (else (cons (sym-check (car ls)) (sym-check (cdr ls))))))

> (sym-check '('a ',(string->symbol "b") 'c))
'(((quote . #t) (a . #t)) ((quote . #t) 
                           ((unquote . #t) 
                            ((string->symbol . #t) ("b" . #f)))) 
                          ((quote . #t) (c . #t)))

и вы получите семь #t с.
Обратите внимание, что ' и , являются «сокращенными» для символов quote и unquote,

> (quote (unquote (string->symbol "b")))
',(string->symbol "b")

и использование list вместо цитирования дает совершенно другой результат:

> (sym-check (list 'a ',(string->symbol "b") 'c))
'((a . #t) ((unquote . #t) ((string->symbol . #t) ("b" . #f))) (c . #t))

, что равносильно оставлению цитаты из списка цитируемых:

> (sym-check '(a ,(string->symbol "b") c))
'((a . #t) ((unquote . #t) ((string->symbol . #t) ("b" . #f))) (c . #t))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...