Схема: Получение 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 делает) вы могли бы:

  1. Как было указано в комментариях, используйте (car (cdr lst)) или просто (cadr lst) коротко
  2. Еще проще: используйте (second lst)
  3. Другая возможность - если в списке только два элемента, и можно заменить его неправильным списком, используйте (define cell (cons 4 5)) или же (define cell '(4 . 5)) чтобы построить против клетки, а затем вы можете использовать (car cell) извлечь первый элемент и (cdr cell) извлечь второй элемент.
Другие вопросы по тегам