Символы, указанные в схеме - PullRequest
7 голосов
/ 11 июля 2011

Я не эксперт по Схемам, поэтому не уверен, что здесь используется правильная терминология. Пусть код говорит сам за себя:

CSI> (define tree '(1 2 3 'Symb 4 5 6))
#<unspecified>
CSI> tree
(1 2 3 (quote Symb) 4 5 6)
CSI> (symbol? 'Symb)
#t
CSI> (map symbol? tree)
(#f #f #f #f #f #f #f)

Исходя из фона Clojure, я думал, что такие символы использовались в Схеме, как ключевые слова в Clojure. Я должен пройти через структуру вложенного списка и заменить символы вызовом функции. Это мое одномерное решение, и оно работает:

(define (print-track track attrs)
    (apply fmt #t
        (map (lambda (attr)
               (cond 
                     ((symbol? attr) (get-attr attr track))
                     (else           attr)))
             attrs)))

Пустое пространство над строкой (symbol?) было условным для (list?), но, скорее всего, это неправильный подход.

Я использую Куриную Схему.

1 Ответ

18 голосов
/ 11 июля 2011

Вы столкнулись с цитатой Лиспа "Гоча".В Схеме символы используются для ссылки на переменную, что вы, очевидно, понимаете.Это дает значение true:

> (symbol? 'Symb)

, потому что вы заключили в кавычки символ и не допустили его использования в качестве ссылки на переменную.

> (symbol? Symb)

Сначала будет искать значение переменной Symb, а затем проверьте, является ли это значение символом.

> (let ((Symb 'foo)) (symbol? Symb))

Будет иметь значение #t, поскольку значение Symb является символом: foo.

> (let ((Symb 7)) (symbol? Symb))

Конечно,, оцените # f.

Вы, кажется, наткнулись на нюанс цитаты.

'Symb

на самом деле является сокращением;это эквивалентно

(quote Symbol)

, который, опять же, возвращает свой неоцененный аргумент.

Но ваш код не нуждается во внутренней кавычке.Когда вы

> (define tree '(1 2 3 'Symb 4 5 6))

весь список цитируется; Ничего внутри списка будет оцениваться.Вот почему

> tree ; => (1 2 3 (quote Symb) 4 5 6)

Внутри цитируемого списка 'Символ эквивалентен (цитирует Символ), который на самом деле является списком.Поскольку весь список заключен в кавычки, использование символа без кавычек не будет рассматриваться как ссылка на переменную.Это был бы просто символ.

> (define tree '(1 2 3 Symb 4 5 6))
> tree ; => (1 2 3 Symb 4 5 6)

Теперь, если бы вы передавали все эти аргументы в функцию списка, то, что вы изначально делали, было бы правильно:

> (define tree (list 1 2 3 'Symb 4 5 6))
> tree ; => (1 2 3 Symb 4 5 6)

В этом случаевы передаете эти аргументы в функцию;аргументы функции оцениваются, поэтому вам нужно заключить в кавычки, чтобы символы не рассматривались как ссылки на переменные.

> (define tree (list 1 2 3 (quote Symb) 4 5 6))

Будет делать то же самое.

...