Вы можете написать функцию, которая проверяет, являются ли элементы символами.
Соедините элемент с его «символикой» для ясности:
(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))