Как написать свой «список»?процедура в схеме - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь написать свой собственный список?Предикат в схеме.Я знаю это определение списка: 1. en пустой список 2. пара, чей cdr является парой

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

(define (my-list? x)
  (if (equal? x ()) #t
      (pair? x)))

1 Ответ

0 голосов
/ 02 февраля 2019

Процедура list? проверяет, является ли список правильным (вложенные cons-ячейки, заканчивающиеся значением null), поэтому мы должнырассмотрим три случая:

(define (my-list? x)
  (cond ((null? x) #t)                 ; empty list
        ((pair? x) (my-list? (cdr x))) ; pair, advance recursion
        (else #f)))                    ; atom

Значение null считается пустым списком.Если мы в паре, то мы продвигаемся по cdr, вызывая процедуру рекурсивно.Если это не null, ни пара, это атом.Это будет охватывать крайние случаи, такие как:

(my-list? 42)
=> #f
(my-list? (cons 1 2))
=> #f

и вернет true для правильных списков:

(my-list? '())
=> #t
(my-list? (cons 1 (cons 2 '())))
=> #t
...