Пара и список отличаются в схеме? - PullRequest
20 голосов
/ 15 мая 2011

Интересно, означают ли '(1 . 2) и '(1 2) те же данные (равные друг другу) на схеме или нет? Я думаю, что это одно и то же, это правильно?

Ответы [ 5 ]

29 голосов
/ 15 мая 2011

Нет, они не одинаковы.

'(1 . 2) означает (cons 1 2)

тогда

'(1 2) означает (cons 1 (cons 2 nil))

3 голосов
/ 15 мая 2011

(1 . 2) иногда называют неправильным списком, потому что он не завершается NIL. (1 2), представленное в виде точки, может быть написано (1 2 . NIL), но вы не должны писать что-то подобное.

2 голосов
/ 21 мая 2015

Доктор Рэктект объясняет это гораздо яснее:

"A pair объединяет два произвольных значения ..... Процедура cons создает пары"

(cons 1 2)
'(1 . 2)

(pair? (cons 1 2))
#t

с другой стороны

"Список - это комбинация пар, которая создает связанный список. Точнее, список - это либо пустой список, либо ноль, либо пара, чей первый элемент является элементом списка, а второй - списком."

 (cons 0 (cons 1 (cons 2 null)))
'(0 1 2)

http://docs.racket -lang.org / гид / pairs.html

пожалуйста, LISP существует с 50-х годов, чтобы получить точные ответы, посмотреть их документацию и пример, который они используют более 60 лет. Некоторые люди там даже не родились.

1 голос
/ 09 февраля 2014

Да!

Пары: (cons y z) создает пару между значениями y и z. Аналогично, (более сложное) выражение (cons x (cons y z)) создает пару между x и парой (y . z). Вы также можете представить эти пары как '(y . z) и '(x . (y . z))

Списки: Список - это просто особый тип пары. Это тот случай, когда значение спаривается с уже существующим списком. Так как самый первый список должен где-то начинаться, у нас всегда есть нулевой список '() (иногда называемый «пустым списком»), готовый к сопряжению. Таким образом, (cons y '()) соединяет y с нулевым списком, чтобы стать списком из одного элемента '(y). Аналогично, (cons x '(y)) и (cons x (cons y '())) соединяют x со списком '(y), чтобы стать списком '(x y).

0 голосов
/ 18 апреля 2018

Список должен заканчиваться пустым списком (также называется нулевым). Ниже пример кода на repl иллюстрирует разницу.

> (cons 1 (cons 2  '())) ; I am a pair as well as list
'(1 2)
(pair?  (cons 1 (cons 2  '()))) 
#t
> (list?  (cons 1 (cons 2  '())))
#t


> (cons 1 (cons 2 3)) ;I am a pair but but not list
'(1 2 . 3)
> (pair? (cons 1 (cons 2 3)))
#t
> (list? (cons 1 (cons 2 3)))
#f   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...