Как получить первый список из списков списков? - PullRequest
0 голосов
/ 23 марта 2019

Итак, у меня есть список списков. Допустим, это '(' (1 2) '(3 4)), и если я применю автомобиль, результат будет' '(1 2). Что я мог бы использовать, чтобы получить '(1 2).

(автомобиль '(' (1 2) '(3 4))) '' (1 2)

1 Ответ

2 голосов
/ 24 марта 2019

'expression дает expression дословно, независимо от того, expression. Однако Racket REPL имеет странную визуализацию, которая на самом деле не печатает результат, а скорее выражение, которое оценивает тот же результат. Таким образом, REPL напечатает 'expression, даже если результат будет expression. Оценивая вывод REPL, затем всегда печатает то же самое снова.

Итак, представьте, что вы делаете '(1 2), вы получаете '(1 2) назад и делаете предположение, что ' каким-то образом является частью данных, и пытаетесь сделать '('(1 2) '(3 4)) вместо '((1 2) (3 4)). Теперь, поскольку 'x является сахаром для читателя для (quote x), вы сделаете '((quote (1 2)) (quote (3 4))) с quote просто символами, а не кодом.

Если вы действительно хотите (1 2), вам нужно сделать автомобиль, CDR, автомобиль или cadar для краткости:

(cadar '((quote (1 2)) (quote (3 4)))) 
; ==> (1 2) , but racket will print '(1 2)

Если вы на самом деле не хотели получать дополнительные списки, а просто чтобы данные были ((1 2) (3 4)), вы правильно сделали:

(car '((1 2) (3 4))) 
; ==> (1 2) , but racket will print '(1 2)

Если вы display значение, оно фактически выведет правильный результат: (display '(1 2)) печатает (1 2), а не '(1 2).

Существует настройка для отключения путаницы. В выпадающем меню внизу, где вы можете выбрать choose language, и в разделе «Язык ракетки» у вас есть опции справа, где вы можете изменить «стиль вывода» на write. Теперь он будет печатать (1 2), а не выражение, которое оценивается в (1 2) на языке рэкет тоже.

...