Схема: Получение CDR без паренов
Это, наверное, простая вещь, которую я скучаю, но я пытаюсь получить cdr
пары и каждый звонок, чтобы сказать (cdr (cons 'a '5))
возвращается как (5)
, Я понимаю, почему это так, но как я могу получить его, чтобы вернуть без паренов?
Я не хочу использовать flatten
потому что то, что я пытаюсь получить (то есть cdr), само по себе может быть другим выражением процедуры, уже заключенным в скобки, поэтому я не хочу сглаживать список.
(Если это имеет значение, я работаю над преобразованием let
выражение в lambda
выражение, и это один из шагов, которые я предпринимаю, пытаясь разорвать лямбда-привязки, чтобы я мог перемещать их).
1 ответ
Применительно к правильному списку, cdr
всегда будет возвращать другой список (в том числе '()
Пустой список).
Под правильным списком я подразумеваю список, который заканчивается пустым списком. Например, когда вы делаете это (define lst '(4 5))
под капотом это то, что присваивается lst
: (cons 4 (cons 5 '()))
поэтому, когда вы оцениваете (cdr lst)
вы получаете второй элемент первого cons
, который случается (cons 5 '())
который в свою очередь печатается как (5)
,
Для извлечения только второго элемента в списке (не второго элемента первого cons
, который является то, что cdr
делает) вы могли бы:
- Как было указано в комментариях, используйте
(car (cdr lst))
или просто(cadr lst)
коротко - Еще проще: используйте
(second lst)
- Другая возможность - если в списке только два элемента, и можно заменить его неправильным списком, используйте
(define cell (cons 4 5))
или же(define cell '(4 . 5))
чтобы построить против клетки, а затем вы можете использовать(car cell)
извлечь первый элемент и(cdr cell)
извлечь второй элемент.