Содержит ли ненулевой список схем хотя бы один атом? - PullRequest
0 голосов
/ 13 декабря 2018

In Маленький Схемер (4-е изд.) утверждается, что список, для которого null? ложно, содержит хотя бы один атом , илитак что я понимаю из моего прочтения текста.

Это не имеет смысла для меня, поскольку (atom '()) является ложным, и мы можем вставить их в список, чтобы сделать его ненулевым:

> (null? '(()))
#f

Итак, мой вопрос, является ли это ошибкой в ​​моем чтении или вопросом определений?Поскольку это не опечатки, я полагаю, что в такой хорошо изученной книге не было бы такой ошибки.

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

(это было проверено в Racket 7.0, с определением atom?, приведенным вкнига, то есть

(define atom?
  (lambda (x)
  (and (not (pair? x)) (not (null? x)))))

Я знаю, что это не распространяется на забавные функции Ракетки, но здесь должно быть достаточно.)

Ответы [ 3 ]

0 голосов
/ 13 декабря 2018

Я думаю lat указывает на список атомов.Таким образом, если lat не равно null?, то он должен содержать хотя бы один атом.

Существует процедура с именем lat?, определенная следующим образом:

(define lat?
  (lambda (l)
    (cond
      ((null? l) #t)
      ((atom? (car l)) 
       (lat? (cdr l)))
      (else #f))))

(lat? '(()) ; ==> #f таким образом, по определению '(()) не является lat, и, следовательно, утверждение не относится к этому списку.

Список может содержать элементы любого типа , включая пустые и другие списки, которые не являются атомами.lat ограничен плоским списком только с атомарными элементами.

0 голосов
/ 13 декабря 2018

Как понятие «атом» - это то, что не может быть разбито на более мелкие части.Число 42 является атомом, список (42 43) не является атомом, поскольку он содержит две меньшие части (а именно числа 42 и 43).Поскольку пустой список не содержит меньших частей, по этой логике он является атомом.

Теперь давайте попробуем реализовать предикат atom?, который определяет, является ли его ввод атомом.

(define (atom? x)
  (cond
     [(number? x) #t]
     [(symbol? x) #t]
     [(char? x)   #t]
     ...
     [else #f]))

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

(define (atom? x)
  (not (list? x)))

Это будет правильно возвращать false для непустых списков и true для чисел, символов и т. Д. Однако это будет возвращать false для пустого списка,

Поскольку авторы книги должны определить термин «атом» (слово не фигурирует в стандарте языка), они, возможно, выбрали вышеприведенное простое определение.

Обратите внимание, что определение «не в списке» вводит в заблуждение, когда язык содержит другие сложные структуры данных, такие как векторы и структуры.Если я правильно помню, единственная составная структура данных, обсуждаемая в книге, это списки.

0 голосов
/ 13 декабря 2018

lat - это , предполагается, что будет списком атомов на тот момент в книге.

Если он не пустой, по определению содержит несколько атомов.

Речь идет не о Лиспе, а о презентации книги.

...