Проверьте, является ли аргумент точечной парой, а не списком - PullRequest
0 голосов
/ 29 октября 2018

Я только начал изучать ракетку, и мне нужно проверить, является ли аргумент точечной парой.

Я пробовал это:

(pair? '(a . 1))

И возвращает #t.

(pair? '('(a b c) . 1))

И возвращает #t.

(pair? '(a b c))

И возвращает #t. Но я хочу получить #f в этом случае.

Есть ли другая процедура, подобная pair?, чтобы получить истину, только когда я передал в качестве аргумента пунктирную пару?

Может быть, мне придется реализовать процедуру, которая проверяет, не является ли это списком, прежде чем я проверю, является ли она парой.

UPDATE
Мне нужно только проверить, что '(a . 1) является пунктирной парой, а любой список не является пунктирной парой.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Если мы педантичны, пунктирная пара - это не что иное, как нотация, способ написать пару. Выражение ’(a . d) вычисляется как значение, а именно cons-ячейка.

Когда функция применяется к некоторым аргументам, аргументы являются значениями. Это означает, что функция не может получить пунктирную пару - она ​​может получить ячейку cons.

Хорошо - но может ли функция узнать, является ли значение конс-ячейкой или списком? Зависит от того, что вы имеете в виду. Список представляется как нулевой (пустой список) или как cons-ячейка, вторым элементом которой является список.

Предикат pair? поэтому вернет true для всех списков (кроме пустого списка). Теперь мы можем проверить, что cons-ячейка не является первой cons-ячейкой списка, написав (and (pair? x) (not (list? x))).

0 голосов
/ 29 октября 2018

Мне не известна встроенная функция фильтрации точечных пар. Но реализация должна быть простой. Просто проверьте, является ли аргумент списком с более чем одним элементом и что cdr списка не является самой парой.

Вот пример реализации.

(define (not-list-dotted-pair? x)
  (and
    (pair? x)
    (not (null? (cdr x)))
    (not (pair? (cdr x)))))
...