Содержит ли ненулевой список схемы хотя бы один атом?

В The Little Schemer (4-е изд.) утверждается, что список, для которого null? неверно, содержит как минимум один атом , по крайней мере, я так понимаю из моего чтения текста.

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

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

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

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

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

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

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


person Tumok A. Byrd    schedule 13.12.2018    source источник
comment
Насколько мне известно, по крайней мере, из Common Lisp, nil (a. K. A. ()) - это атом, но я также нашел определение, которое вы много раз давали в Интернете. Первый создает дихотомию между atom и cons, а второй - между atom и list. Для меня первое имеет больше смысла.   -  person Svante    schedule 13.12.2018
comment
Традиционное определение атома - это все, что не является минусом. Это не означает, что это единственный возможный вариант, но это то, что использует CL, и он восходит (по крайней мере) к Lisp 1.5.   -  person    schedule 13.12.2018
comment
Я не думаю, что тег language-lawer здесь уместен, поскольку TLS ни в коем случае не является стандартом, и понятие «атом» не определено ни в одном стандарте Схемы.   -  person Alexis King    schedule 13.12.2018
comment
@AlexisKing Меня вот-вот рассердит ваше мета-юрист (множество реальных законов прямо не написано), но я только что понял, что вы выступали в отличном выступлении Хакетта на Strange Loop, которое я смотрел на другой вкладке .   -  person Tumok A. Byrd    schedule 17.12.2018


Ответы (3)


lat предполагается как список атомов в этом месте книги.

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

Дело не в Лиспе, а в оформлении книги.

person Will Ness    schedule 13.12.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 - это простой список, состоящий только из атомарных элементов.

person Sylwester    schedule 13.12.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 для пустого списка.

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

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

person soegaard    schedule 13.12.2018
comment
хотя (list? '(1 . 2)) возвращает #f, но '(1 . 2) определенно не атом ... - person Will Ness; 14.12.2018
comment
Не помню. :) - person Will Ness; 14.12.2018