LINUX.ORG.RU

Лисп. Точечные пары.

 


2

3

С недавних пор взялся за изучение лиспа и никак не могу нигде найти инфу, зачем нужны точечные пары. Я знаю, что любой список является в Лиспе точечной парой, прошу не объяснять, об этом везде пишется. Но неясно, почему нельзя, как бы, выпилить вообще эти точки, на мой взгляд, нет такой ситуации, где нельзя было бы обойтись просто списками. Собственно, в Newlisp, ЕМНИП, так оно и сделано. Единственным мыслимым применением точечных пар, мне представляется ситуация, когда из точечной пары достается хвост, который не является списком, например, (cdr (1 . 2)), но очевидно, что здесь мы могли бы тоже обойтись списком и доставать 2 значение с помощью cadr. Создается такое ощущение, что эта структура имела какое то особенное значение в старых лиспах, а сейчас осталась как атавизм.

Какой же настоящий смысл данной структуры?


Тонко.

какой же настоящий смысл данной структуры?

Ну, вообще-то точечная пара это принцип хранения данных. На самом деле привычные тебе списки так и хранятся:

(1 2 3)
=>
(1 . (2 . (3 . NIL)))

А современная запись списков, это всего лишь упрощённая запись точечных пар. Т.е. современная запись это условность, о которой когда-то договорились.

Кроме того иногда нужно оперировать действительно точечными парами. Но, думаю, тебе ещё далеко до этого.

ziemin ★★
()

Какой же настоящий смысл данной структуры?

В том, что её можно использовать как строительный кирпичик для построения списков. А списками можно выразить всё остальное. Поэтому точечные пары типа «базовее», «важнее» и именно с ними носятся как с писаной торбой, а не со списками.

ilammy ★★★
()
Ответ на: комментарий от ziemin

списки так и хранятся

Да я это знаю, я же написал. Меня интересует именно:

Кроме того иногда нужно оперировать действительно точечными парами

Когда именно это необходимо, в каких случаях мы не можем обойтись списками?

phill
() автор топика
Ответ на: комментарий от phill

Когда используешь т.н. «опасные» операции. Тогда надо чётко представлять, как это устроено. Иначе грабли неизбежны.

ziemin ★★
()
Ответ на: комментарий от ilammy

Извините за бестолковость, но я так и не понял. Зачем программист должен в явном виде, как бы, иметь в виду, что язык содержит такую структуру данных как точечная пара, если можно было бы вообще забыть про нее и строить любые данные на списках. Вот например, смысл векторов вполне очевиден, их списками не заменишь (в смысле, быстрого доступа по индексу). А зачем нужны точечные пары, я так и не понял.

phill
() автор топика

ЛИСП лучше ветеранов

anonymous
()
Ответ на: комментарий от phill

как-то когда матанам понадобились упорядоченые пары [a,b] они отчего-то определили их как {a,{a,b}} где {} множество.

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

можно вместо бинарной ёмкости можеш начать использовать тернарную получиш car|cbr|cdr ёмкость - поэкперементируй = это забавно.

qulinxao ★★☆
()
Ответ на: комментарий от phill

А зачем нужны точечные пары, я так и не понял.

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

ziemin ★★
()
Ответ на: комментарий от qulinxao

Ну вот это еще более-менее понятно, спасибо большое за ответ.

phill
() автор топика

С недавних пор взялся за изучение лиспа

Но зачем?

Ведь есть более простые способы выделиться из толпы и почувствовать себя небыдлом.

anonymous
()
Ответ на: комментарий от Deleted

Википедия пишет:

В языке Python кортеж (англ. tuple) отличается от списка тем, что элементы кортежа нельзя изменять.

Но в лиспе получается, что любой список является набором из вложенных точечных пар, так что, я теряюсь. В принципе, список, наверное, условно, можно считать неизменяемой структурой, хотя любой список легко переопределить как-то так: (set! the-list (cdr the-list)). Но наверное, все-таки неизменяемая, да, я запутался.

phill
() автор топика
Ответ на: комментарий от phill

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

Deleted
()
Ответ на: комментарий от phill

любой список легко переопределить как-то так: (set! the-list (cdr the-list))

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

Но в лиспе получается, что любой список является набором из вложенных точечных пар, так что, я теряюсь

Как раз из-за того, что это точечные пары это и возможно. Иначе для изменения элемента приходилось бы пересобирать весь список.

ziemin ★★
()
Ответ на: комментарий от ziemin

А если мы хотим изменить один элемент в середине списка, например в списке (1 2 3), захотим изменить 2 на 4, разве не придется пересобирать (рекурсивно) весь список с помощью cons? Есть другой способ?

phill
() автор топика
Ответ на: комментарий от phill

Да я sicp взялся читать, заодно решил освоить.

Что SICP, что LISP — в XXI веке бесполезное знание. Подумай хорошенько, нужен ли тебе сейчас древнегреческий и латынь (если ты, конечно, не филолог-специалист).

anonymous
()
Ответ на: комментарий от phill

>любой список легко переопределить как-то так: (set! the-list (cdr the-list))

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

Что не понятно?

ziemin ★★
()
Ответ на: комментарий от sdio

Я бы сказал что и русский язык не нужен в XXI веке, согласен?

Нет.

На русском языке, помимо нас с тобой, говорят 146 миллионов человек в России и несколько миллионов за рубежом. На русском языке написаны великие книги, сняты замечательные фильмы и сочинены прекрасные песни.

Русский язык нужен. Как нужны английский, немецкий, французский и десятки других живых языков. Как нужны Java, C, C++, Python, JavaScript, Scala и другие мейнстримные языки, на которых пишется весь софт сегодня.

Лисп же, как и латынь с древнегреческим, могут представлять в XXI веке только одну ценность, — историческую.

anonymous
()
Ответ на: комментарий от anonymous

На русском языке написаны великие книги, сняты замечательные фильмы и сочинены прекрасные песни.

Это в прошлом, мы говорим о ХХI веке. Производства нет, образование низкого качества, даже спорт загублен. Сегодня это мертвый язык (по аналогии с лиспом). 150 миллионов человек это 2.5% населения Земли, боюсь лисперов в среди программистов больше.

sdio ★★★★★
()
Ответ на: комментарий от ziemin

ЯННП. Причем тут точечные пары? В строках, например, нет никаких точечных пар, но мы точно также можем заменить любой элемент строки, переопределив строку. Например (код на newlisp, где, кстати, точечных пар вообще нету):


(define str "aaaabaa")
(define proc (lambda(str old-symb new-symb)
	       (cond
		 ((= "" str) "")
		 ((= old-symb (first str)) (append new-symb (cdr str)))
		 (true (append (first str) (proc (rest str) old-symb new-symb))))))

(set 'str  (proc str "b" "c"))

(print str) ; ---> aaaacaa


anonimous
()
Ответ на: комментарий от anonymous

Что SICP, что LISP — в XXI веке бесполезное знание. Подумай хорошенько, нужен ли тебе сейчас древнегреческий и латынь (если ты, конечно, не филолог-специалист).

Ну, насчет лиспа еще можно поспорить, но sicp - это фундаментальная книга по программированию. С какого х*я она должна устареть?

Как вариант, сейчас есть вообще то sicp на JS, и на Питоне даже, ЕМНИП. Но все же, наверное, Scheme - оптимальный вариант, хотя бы потому, что в инете sicp обсуждается, даются примеры с пояснениями, и прочее, на Scheme, поэтому, лучше лисп все-таки.

anonimous
()
Ответ на: комментарий от anonymous

Подумай хорошенько, нужен ли тебе сейчас древнегреческий и латынь (если ты, конечно, не филолог-специалист)

Вот не надо таких обидных параллелей! Латынь нужна медикам (и католическим попам, но они не считаются), а лишпег не нужен вообще никому.

anonymous
()
Ответ на: комментарий от anonimous

но sicp - это фундаментальная книга по программированию

SICP - тупенький букварь для дошколят. Фундаментальная книга по программированию - это тот же Кормен, это Вирт, это, в конце концов, Кнут. А в sicp полезных знаний нет, только убогая банальщина, которую и так все знают.

anonymous
()
Ответ на: комментарий от anonymous

Латынь нужна медикам

//offtop

А на*я она им нужна, если уж на то пошло? Чтоб косяки свои скрывать в рецептуре и диагностике? Латынь, плюс почерк уе*щный, концов потом не найдешь — это единственный смысл. В остальном — русский+немного английского, будет достаточно по-любому. К тому же, из латыни они, скорей всего, знают только фармацевтические наименования, латынщики ху*вы.:)

anonimous
()

Прелести динамической типизации.

Список в нормальном языке устроен примерно так:

data List a = Nil | Cons a (List a)
По русски: список — это либо пустой список (Nil), либо конструкция (Cons) состоящая из двух элементов, первый — голова списка, второй — хвост.

Это удобно, так как появляется возможность, скажем, паттерн-матчить список:

  case myMegaList of
    Nil -> шо-то одно
    Cons hd tl -> шо-то другое, использующее hd и tl
Появляются всякие симпатичные рекурсивные штуки, и вообще, не надо плодить сущностей.

Ну, то, что оно удобно, все и так понимают. Но если статических типов нет, то в Cons вторым аргументом может прилететь что попало, а не только список. Соответственно, мы либо шлём список лесом при создании, либо разрешаем иметь Cons, где «хвост» — не список, а не пойми что.

Ну а так как идеология Лиспа состоит в том, чтобы обеспечивать программиста максимальным количеством секса на рабочем месте, то обнаружение ошибок там откладывается на как можно позже. То есть, приходится точечные пары разрешать.

Другая причина — это присущее всем низкоуровневым языкам желание дать программисту максимальный доступ к потрохам, чтобы он покопался там вволю и опять-таки поимел секса.

Miguel ★★★★★
()
Последнее исправление: Miguel (всего исправлений: 1)
Ответ на: комментарий от anonimous

А на*я она им нужна, если уж на то пошло?

Чтобы иметь универсальную, интернациональную терминологию. Так же, как у философов вся терминология из немецкого, а у математиков из французского.

В остальном — русский+

Русский вообще на хуй не нужен.

немного английского,

Ну да, арабским, латиноамериканским, немецким и исландским медикам очень-очень нужен английский. Или еще какая хуйня типа русского. А так они все УЖЕ говорят на одном языке. И это правильно.

К тому же, из латыни они, скорей всего, знают только фармацевтические наименования, латынщики ху*вы.:)

Не, большинство на разговорном уровне владеет.

anonymous
()
Ответ на: комментарий от anonymous

тупенький букварь для дошколят

Ну,пусть и букварь, но всяко лучше, чем «Java за fixnum days» Я смотрел, BTW, видеоверсию, и там митовские студенты, родом из 60-х, не чета теперешним, и среди них наивнейшие вопросы возникали, типа: а чем лет отличается от define. И это уже на материалах 3-й главы, ЕМНИП. Так что хз, букварь или не букварь. Многие писали, что студенты ведущих ВУЗов мира не тянут этот курс, во многих его отменили из-за сложности. Спорный вопрос.

anonimous
()
Ответ на: комментарий от anonimous

и там митовские студенты

Америкашки же, тупые, убогие. Они даже нашим ПТУшникам в подметки не годятся, я уж молчу про студентов какой-либо Бауманки.

anonymous
()
Ответ на: комментарий от anonymous

Америкашки же, тупые, убогие.

Ага, только почему-то в CS русские всю жизннь ихние технологии тащат, своего ничего не родили внятного, кроме рефала, который тоже накуй никому не нужен. Даже, ЕМНИП, архитектуру у них, толи с PDP, толи с другой какой-то куйни содрали. В космосе, может и превзошли, но не в CS. И до сих пор в хвостах плетемся. Все технологии и языки ихние. Да и космос, впрочем, просрали уже.

anonymous
()
Ответ на: комментарий от x4DA

Да я на все диалекты понемногу смотрю, чтобы сложилось общее представление о лиспе. И, кстати, слышал уже негативные отзывы о Newlisp. Почему его не стоит учить? Из-за того, что он не компилируется, или по другой причине? Его хвалят вроде, за кроссплатформенность, и легкое написание скриптов для администрирования осей. Для этих целей он тоже не подходит?

phill
() автор топика

Нахрена нужны туплы вообще?

А массивы? Словари?

Короче, с опытом понимание придет.

lovesan ★★★
()
Ответ на: комментарий от anonymous

Не, большинство на разговорном уровне владеет.

Полчаса жир от монитора оттирал. Они разговаривают на латыни, языке, который уже более тысячи лет является мертвым, языке цезарей??????!!!!!

Чо, каникулы штоле начались? Или весна чтоль на дворе...

anonymous
()
Ответ на: комментарий от phill

кроссплатформенность, легкое написание скриптов для администрирования осей и т.п. - это есть и у CL, например у реализации clisp.

Newlisp же - кривое говно, написанное недоучкой, не осилившим даже GC написать. Уровень языка по фичам и удобству - ниже чем у лиспов начала 70х годов.

И вот оставайся он просто никому не нужным и никому не известным кривым поделием - все бы ничего.

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

lovesan ★★★
()
Ответ на: комментарий от lovesan

отчаянно пиарит и при этом много врет

Прямо уж так и врет. Его мнение не обязано совпадать с мнением CL-фанбоев. Пример явного вранья в студию!

Да и про пиар, это че-то слишком громко сказано. Пара статеек на собственном малюсеньком сайте - это конечно наглейший пиар. Про него пишет, в основном, малюсенькое маргинальное комьюнити в большей степени, нежели сам автор. Причем, CL-щики обычно утираются в немногочисленных лиспосрачах на эту тему, они его панически бояться, особенно, видать, бояться за свои holy macros, которые откровенно сливают сабжевым.

anonymous
()
Ответ на: комментарий от anonymous

Даже, ЕМНИП, архитектуру у них, толи с PDP, толи с другой какой-то куйни содрали.

Так то благодаря американскому диверсанту Ершову, другану Кнута.

До Ершова были Минск, Эльбрус и ЦВК.

anonymous
()
Ответ на: комментарий от phill

Для простых целей он подходит, но это «неправильный» лисп. Его критика гуглится в comp.lang.lisp

x4DA ★★★★★
()
Ответ на: комментарий от anonymous

У этого newlisp главная проблема - хреновая лицензия, которая не позволяет делать из него закрытые бинари. Нахер он кому сдался такой?

x4DA ★★★★★
()
Ответ на: комментарий от phill

если список иммутабельный (компилятору это известно), то он способен выполнить оптимизацию, «склеив» список из кусков.

x4DA ★★★★★
()
Ответ на: комментарий от lovesan

кроссплатформенность, легкое написание скриптов для администрирования осей и т.п. - это есть и у CL

Выдыхай, Димон.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.