LINUX.ORG.RU

Ручное управление памятью в лиспе

 


2

3

Подскажите, пожалуйста, можно ли в лиспе работать с собственными структурами как в с++? Например вручную указать сколько памяти выделить для хранения и т.п. Гуглил, что можно делать как то через FFI, но ни одного примера не нашел, поэтому спрашиваю на данном форуме - можно ли управлять памятью программы и работать с указателями вручную?


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

писАть неграмотно это всё равно что писАть мимо

писАть неграмотно это всё равно что пИсать мимо

как горизонтальное плато вот на этой картинке

вертикальный скачок

anonymous
()

а вторая половина данного балета треда с преданием альтернативно мыслящего qulinxao остракизму — это в чистом виде эффект социального торможения , вот ролёвка

роли социальных тормозов и ингибиторов самим нетрудно прикинуть будет.

qulinxao, фасилитируй это

anonymous
()

Горы лиспосрачей уже перечитал тут, а конкретных недостатков лиспов никто так и не сформулировал. Неужели все лиспофобы это простые неосиляторы, которые дальше скобок ничего так и не увидели?

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

Самый активный, судя по всему, кроме явы ничего не видел

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

Горы лиспосрачей уже перечитал тут, а конкретных недостатков лиспов никто так и не сформулировал. Неужели все лиспофобы это простые неосиляторы, которые дальше скобок ничего так и не увидели?

Если вы перечитали горы лиспосрачей и так и не поняли, что говорили критики лиспа, значит вы просто не в состоянии этого сделать. Не беда: нормальное распределение по IQ естественно, а что естественно — то не постыдно.

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

Горы лиспосрачей уже перечитал тут, а конкретных недостатков лиспов никто так и не сформулировал.

Но ведь это ложь. Зачем ты лжёшь нам, и, самое главное, себе?

Неужели все лиспофобы это простые неосиляторы

Но зачем? Ведь сами лисперы справляются с этой задачей значительно лучше.

Какашки в Common Lisp (11 страниц, автор mv)
Главная Проблема Лиспа (автор Love5an)
[lisp] несколько гадостей (на самом деле — больше десятка, автор den73)
Пакеты. Как должно быть? (диалог monk и den73, обсуждение граблей системы пакетов)

Разе этого мало? Впрочем, мне кажется, ты просто не хочешь видеть «конкретных недостатков» своего объекта поклонения.

Ведь это так характерно для сектантов.

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

Если вы перечитали горы лиспосрачей и так и не поняли, что говорили критики лиспа, значит вы просто не в состоянии этого сделать.

Читайте внимательнее, я понял что они говорили, но все их всхлипы практически никогда не выходят за пределы «эти мерзких скобок».

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

Какашки в Common Lisp (11 страниц, автор mv) Главная Проблема Лиспа (автор Love5an) [lisp] несколько гадостей (на самом деле — больше десятка, автор den73) Пакеты. Как должно быть? (диалог monk и den73, обсуждение граблей системы пакетов)

Меня интересуют именно недостатки лиспов, а не кривости конкретных реализаций и его слабая распространенность. Отсутствие библиотек не может быть недостатком лиспа, т.к. в этом случае встает проблема курицы и яйца. Должна быть проблема в Лиспе или в головах codemonkeys, из-за которой нет библиотек. Проблемы Common Lisp в принципе могли бы быть такой причиной, но во-первых есть Scheme/Racket, а во-вторых, неосиляторы до этой стадии не доходят в принципе и об этих проблемах мы слышим только от практикующих лисперов, что логично, т.к. идеальных технологий нет (а уж Common Lisp сложно не пнуть за его исторические особенности).

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

Разе этого мало?

Это ж надо, до какой степени должна была развиться лиспофобия, что бы хранить эти ссылки?

Я не знаю, есть ли среди лисперов такие, которые действительно относятся к инструменту как к «объекту поклонения», но лиспофобоы относятся к нему точно с каким-то религиозным чувством.

Вам бы батенька куда-нибудь на медициский форум сходить, а то местным психоаналитикам (коих, здесь, с избытком) я не очень доверяю.

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

Проблема основная не в недостатках, а в отсутствии достоинств и преимуществ на фоне фанатичной преданности лиспофилов.

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

Должна быть проблема в Лиспе
Меня интересуют именно недостатки лиспов
Отсутствие библиотек не может быть недостатком лиспа

Недостатки чего, простите, интересуют? Недостатки лиспа?

Но ведь это чушь. Я удивляюсь, насколько можно быть некомпетентным и при этом с апломбом нести бред в дискуссии о «лиспе».

Ведь не существует такого языка программирования — «лисп». (Если это не так, и CL/Scheme/etc. действительно являются «реализациямия лиспа» — докажи это, приведя спецификацию «лиспа»).

Существуют языки Arc, AutoLISP, Clojure, Common Lisp, Emacs Lisp, EuLisp, Franz Lisp, Interlisp, ISLISP, LeLisp, Maclisp, MDL, Newlisp, NIL, Picolisp, Portable Standard Lisp, Racket, Scheme, SKILL, Spice Lisp, T, XLISP, Zetalisp. Недостатки какого именно тебя интересуют?

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

Это ж надо, до какой степени должна была развиться лиспофобия, что бы хранить эти ссылки?

Не равняй остальных по себе. Мне не надо ничего хранить, у меня хорошая память, и я умею пользоваться Google.

(дальшнейший переход на личности поскипан)

Из вышесказанного я делаю вывод, что по теме тебе ответить нечего, и ты полностью признаёшь вышеприведённые недостатки. Так?

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

У лиспов есть вполне определенные преимущества, которых нет ни в одном другом языке (за исключением Форта): - возможность расширения семантики и синтаксиса языка на самом этом языке - возможность использовать макропрограммирование с такой же лёгкостью, как и обычное (за счет S-выражений) - единый стиль кода с использованием макросов и без них (за счет S-выражений) - возможность использования в качестве хост-платформы для DSL-систем

Причем делать всё это легко и просто, это тебе не к Java/JVM функциональщину, обобщенное программирование без type erasure или алгебраические типы данных с выводом прикурчивать.

Назови хоть один другой язык, который позволяет это, лиспофоб.

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

Недостатки какого именно тебя интересуют?

Это не реализации Лиспа, а его диалекты, полудурок. Если ты так и не понял что их всех объединяет, то ты просто не знаешь Лисп.

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

Поиск в пространстве состояний: сложный метод построения, собственно, самого пространства состояний, сложный метод вычисления оценочной функции, полный перебор исключён. Как-то так.

Ололо! А вот и она, пресловутая коммерческая тайна! С барабанной дробью и помпой нам выкатили старый добрый расстановщик бутылок, как я и предсказывал.

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

Больше пациент ничего серьёзного на лиспе не делал. И то если эту задачу можно назвать «серьёзной», лол. И этого точно нельзя сказать об убогой вебню на лиспер.ру и прочих поделках.

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

нам выкатили старый добрый расстановщик бутылок

Там не было никакого алгоритма, там был редактор и сопутствующий функционал. Кстати, им продолжают успешно пользоваться (и не только для алкоголя) и после моего ухода.

о теории оптимизации, динамическом программировании и
мемоизации

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

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

Но зачем? Ведь сами лисперы справляются с этой задачей значительно лучше.

Сами лисперы сетуют, что у молотка рукоятка могла бы быть поудобней. Они не говорят, что молотком забивать гвозди менее удобно, чем половинкой кирпича, как почти все остальные и делают. Молоток по сравнению с кирпичём и так уже рокет сайенс.

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

Если ты так и не понял что их всех объединяет

Так что же их объединяет?

возможность расширения семантики и синтаксиса языка на самом этом языке
возможность использовать макропрограммирование с такой же лёгкостью, как и обычное (за счет S-выражений)
единый стиль кода с использованием макросов и без них (за счет S-выражений)
возможность использования в качестве хост-платформы для DSL-систем

Но ведь это ложь. AutoLISP, EmacsLisp, Maclisp, Lisp Machine Lisp, LISP 1.5 и многие другие не имеют таких возможностей. (Если это не так — опровергни, реализовав DSL на AutoLISP).

Итак, ты ещё раз подтвердил невладение предметом дискуссии. Единственное, что объединяет все «лиспы» — это префиксная нотация и S-выражения (т.е. «скобки»). Поэтому, если речь идёт о недостатках «лиспов в общем», то, разумеется, претензии будут только к скобкам.

Потому что скобки — это единственное, что объединяет «лиспы». Так что тебе не так, бедняша?

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

Назови хоть один другой язык, который позволяет это, лиспофоб.

Но зачем? Ведь вышеописанные «фичи» «лиспов» не дают реальных преимуществ на практике по сравнению с нормальными языками.

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

Но ведь это ложь. AutoLISP, EmacsLisp, Maclisp, Lisp Machine Lisp, LISP 1.5 и многие другие не имеют таких возможностей. (Если это не так — опровергни, реализовав DSL на AutoLISP).

Поподробнее про отсутствие макросов в EmacsLisp, MacLisp и Lisp Machine Lisp.

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

молотком забивать гвозди менее удобно, чем половинкой кирпича, как почти все остальные и делают

Правильно ли я понимаю, что почти все программисты на свете — быдло и ничего не понимают в профессии, и только лисперы знают, как делать правильно?

Тогда почему на лиспе не пишут операционные системы, системы управления базами данных, серверы приложений, почтовые серверы, веб-серверы, серверы обмена мгновенными сообщениями, игры, браузеры, почтовые клиенты, клиенты обмена мгновенными сообщениями, CAD'ы, CASE'ы, CAM'ы, оптимизирующие компиляторы, среды разработки, системы обработки аудио, системы обработки графики, системы обработки видео, системы 3D-моделирования, embedded software, вебсайты, enterprise системы, middleware, telecom software, high performance и так далее?

О'кей, можем упростить задачу. Покажи написанное на лиспе ядро ОС с возможностями линукса, СУБД с возможностями PostgreSQL, веб-сервер уровня nginx и браузер уровня Firefox. Время пошло.

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

возможность расширения семантики и синтаксиса языка
на самом этом языке

Я видел мало примеров, где эта возможность языка применялась бы с реальной практической пользой и таким образом, который недоступен в других языках. В большинстве случае это просто исправление синтаксиса, но в других языках его просто не надо исправлять, он и так вполне нормальный.

А вот такие вещи, как интерактивная разработка или MOP/CLOS (и ещё некоторые особенности помельче), вот они обеспечивают реальный профит, вполне себе ощутимый на фоне других языков.

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

почему на лиспе не пишут операционные системы, ...

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

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

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

Доказательства в студию. Без доказательств это пустая болтовня.

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

В гугл/википедию/сорцы.

Ну так вот на первом я сам лично не один десяток макросов написал, а из двух других непосредственно получился Common Lisp.

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

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

Так на что же они тогда тратят силы?

ну, про Firefox я промолчу

Так почему до сих пор не сделали лучший Firefox, на лиспе?

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

расставляла товары на полках неким оптимальным способом

Ну ежели оно работает, то и хорошо. Я не специалист по AI, поэтому по теме ничего сказать не могу. Математики много чего интересного напридумывали, может есть сейчас и более мощные алгоритмы.

Больше пациент ничего серьёзного на лиспе не делал. И то если эту задачу можно назвать «серьёзной», лол.

А что можно назвать серьёзной задачей?

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

Правильно ли я понимаю, что почти все программисты на свете — быдло и ничего не понимают в профессии, и только лисперы знают, как делать правильно?

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

[попытка взять на понт]

Бла-бла-бла...

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

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

Так почему эти системы, которые есть и работают неплохо, были написаны на б-гомерзких Си, Си++, жабе и прочих быдлоязыках? Почему они не были написаны на лиспе? Ведь на лиспе их можно было бы написать на порядок быстрее, код получился бы более содержательным и качественным, системы легче было бы развивать и поддерживать? Смотри, столько доводов в пользу лиспа, а весь мир всё равно упорно жрёт говно мейнстрима. Идиоты, наверное? Да?

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

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

Это так, но у всех этих систем есть фатальный недостаток: они неразвиваемы и неподдерживаемы.

Ядро Linux — раздутое и огромное. В PostgreSQL несколько лет не могли запилить нативную репликацию. В браузерах постоянно находят дыры. Так почему бы не написать это всё один раз Правильным™ Образом® (на лиспе, разумеется), чтобы впоследствии избежать проблем с развитием и поддержкой?

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

Т.е. по теме ответить не можешь? Слив засчитан.

Анонимусам необразованным всё по сто раз повторять - это полный рабочий день будет.

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

Так на что же они тогда тратят силы?

За что платят, то, очевидно и делаю, QPX вот хороший пример.

Так почему до сих пор не сделали лучший Firefox, на лиспе?

А почему они должны были его делать?

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

Так почему эти системы, которые есть и работают неплохо,
были написаны на б-гомерзких Си, Си++, жабе и прочих
быдлоязыках?

Во-первых, это не б-гомрезкие и не быдлоязыки (кстати, а где там жаба то?). Что у вас за комплексы? Луговский покусал?

Во-вторых, история названных продуктов началась в 90-ых (а постргесс так вообще в 80-ых). В том момент не было свободных хороших реализаций CL, доступные реализации были медленным и требовали танцев с бубном. Писать что-либо подобное на CL в то время было нельзя в принципе. Более менее вменяемая инфраструктура стала появляться только где-то после 2003-го года (после создания SLIME).

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

Но ведь это ложь. AutoLISP, EmacsLisp, Maclisp, Lisp Machine Lisp, LISP 1.5 и многие другие не имеют таких возможностей. (Если это не так — опровергни, реализовав DSL на AutoLISP).

То есть, ты даже язык общего назначения от внутреннего DSL на S-выражениях не отличаешь? Зачем им там ошметки от лиспа понадобились, когда хватило бы какого-нибудь Lua отдельный вопрос.

Единственное, что объединяет все «лиспы» — это префиксная нотация и S-выражения (т.е. «скобки»).

Не единственное, ещё, как минимум, символы и макросистема, иначе проку от префиксной нотации почти нет.

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

Но зачем? Ведь вышеописанные «фичи» «лиспов» не дают реальных преимуществ на практике по сравнению с нормальными языками.

Дают, ты просто не грамотный.

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

Я видел мало примеров, где эта возможность языка применялась бы с реальной практической пользой и таким образом, который недоступен в других языках. В большинстве случае это просто исправление синтаксиса, но в других языках его просто не надо исправлять, он и так вполне нормальный.

Ну так это от различий в применении. Я на самом CL, например, писать не стал бы по собственной воле, но как хост-платформа Общелисп вполне себе годный, а семантика DSL может быть совсем не похожей на то, чем является Общелисп из коробки.

Если писать на CL руками, то конечно же здесь CLOS и инкрементальная среда рулят.

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

но все их всхлипы практически никогда не выходят за пределы «эти мерзких скобок».

я вообще проблем со скобками не понимаю, это какая-то религиозная заморочка. и раньше это не особо мешало, да и теперь.

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

заценить видеопрезентацию

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

не нравятся S-выражения — попробуйте n-выражения или t-выражения.

есть проект на гитхабе выполненный в этом стиле, имхо читаемо, почти как питон.

всё, кого беспокоили скобки и ногти в овсянке — эту проблему для себя решили. тех кто продолжает ныть на эту тему я уже просто не понимаю.

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

DSL

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

Я на самом CL, например, писать не стал бы по собственной воле

С учётом вышесказанного, если нет такого диалекта лисп, на котором можно писать непосредственно и получать профит по сравнению с другими языками, то скептики правы и лисп действительно можно закапывать. В конце концов, когда в этом есть смысл, то DSL вполне успешно пишут и на других языках.

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

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

Интересно, кстати, что об этом сказали бы все эти неосиляторы.

Если эти readable s-expressions обогатить ещё синтаксисом из Haskell (тем же $, например), то может получиться реальный взрыв мозга для 270тыщвмесяц-школоты, которая никогда не поймет что написано в коде.

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

DSL предполагает проектирование сверху-вниз

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

С учётом вышесказанного, если нет такого диалекта лисп, на котором можно писать непосредственно и получать профит по сравнению с другими языками, то скептики правы и лисп действительно можно закапывать. В конце концов, когда в этом есть смысл, то DSL вполне успешно пишут и на других языках.

Ну почему, меня Racket, в принципе, устраивает как язык (с некоторыми оговорками тоже), просто мне Лисп именно как платформа интересен, а тут Racket сильно отстает от CL.

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

Это не реализации Лиспа, а его диалекты, полудурок. Если ты так и не понял что их всех объединяет, то ты просто не знаешь Лисп.

ну он не так уж и неправ. если понимать под собирательным «Лисп вообще» метаязык символьных вычислений на S-выражениях, какой-то метаЛисп то все эти диалекты Лиспа и есть различные реализации метаЛиспа.

ну стандатные формы в разных диалектах метаЛиспа разные, стандарт, его громоздкость и декларативность — разные, где-то ad-hoc C++ style и задокументированная реализация, где-то он более прозрачен, целостен и продуман; модульность/пакеты/системы-подсистемы, макросы/гигиеничность, пространства имён, объектные подсистемы реализованы по разному.

не суть. всё равно их объединяет общая идея. язык для символьных вычислений, где символ это более гибкая абстракция, чем объект.

абстракции вообще нужно аккуратно разобрать, символ/класс/структура/функции/макросы/модульность/подсистемы/системы, чтобы они с одной стороны не утекали, а с другой, каждая была на своём месте

когда archimag говорит, что макросы-которые-пишут-макросы это зло, я так думаю, он имеет в виду утечку каких-то абстракций.

и общий подход в разных лиспах к design decisions и trade-off'ам реализаций.

генотип и фенотип лиспа, как про это говорит Марк Тарвер.

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

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

то есть, у тебя есть 3d матрица: абстракции, генотип/фенотип, процессы. и это матрица прослеживаемости чего-нибудь.

и ты в этой матрице рисуешь определённую технологическую траекторию, то ли лиспа, то ли чего-то другого.

и сравниваешь эти кривые траекторий со схемами и графиками.

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

ну узнал ты недостатки и воркэраунды, дальше-то что?

кто хочет применять — давно применяет. кто не хочет — тоже давно старается не применять.

допустим, ты увидел недостатки (кризис), нашел способы их решения (катарсис, либо красивые, либо мотки изоленты), а трансформация где и куда будет направлена? где секс, дзен и цимус?

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

Ну ты же сказал про всё прогрессивное человечество. Откуда-то твое мнение взялось, правда? Проекты, статьи, маркетинг - должно же что-то быть.

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

Считай это моим ИМХО. Я специальным исследованием, либо коллекционированием ссылок по теме, не занимался.

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

Единственное, что объединяет все «лиспы» — это префиксная нотация и S-выражения (т.е. «скобки»).

не единственное

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

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

дргуой вопрос, мешают ли они жить. всё фиксабельно ценой какого-то количества времени и энергии, и мотков изоленты, упрятывания каких-то костылей специальных форм под капот реализации или стандарта, встраивания того же Си кода через FFI, например (с чего топик и начинался).

что лично для меня неэстетично и как-то неаккуратненько, но не то чтобы уж сильно мешает жить.

с нетерпением жду обещанную реализацию ECL под LLVM, поэкспериментировать со встраиванием уже средствами LLVM и в итоге получить уже идеально красивый лисп с минимумом костылей в стандарте, с наиболее straitforward реализацией.

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