Схема: получение CDR без паренов - PullRequest
3 голосов
/ 20 ноября 2011

Это, вероятно, простая вещь, которую я упускаю, но я пытаюсь получить cdr пары, и каждый вызов, чтобы сказать (cdr (cons 'a '5)), возвращается как (5).Я вроде понимаю, почему это так, но как я могу заставить его возвращаться без паренов?

Я не хочу использовать flatten, потому что то, что я пытаюсь получить (т.е. CDR)само по себе может быть другим выражением процедуры, уже заключенным в скобки, поэтому я не хочу сглаживать список.

(Если это имеет значение, я работаю над преобразованием выражения let в выражение lambdaи это один из шагов, которые я предпринимаю, пытаясь разорвать лямбда-привязки, чтобы я мог их перемещать).

1 Ответ

7 голосов
/ 20 ноября 2011

При применении к правильному списку, 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)), чтобы создать ячейку cons, а затем вы можете использовать(car cell) для извлечения первого элемента и (cdr cell) для извлечения второго элемента.
...