Вы столкнулись с цитатой Лиспа "Гоча".В Схеме символы используются для ссылки на переменную, что вы, очевидно, понимаете.Это дает значение 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))
Будет делать то же самое.