Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.94/195: Рейтинг темы: голосов - 195, средняя оценка - 4.94
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038

Common Lisp vs D

13.03.2015, 03:11. Показов 46185. Ответов 1012
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Может быть, попробуем затеять холиварчик. Чтобы было менее честно, можно противопоставлять языку D все языки семейства лисп. Чтобы было холиваристей, приветствуется участие людей, владеющим только одним из упомянутых языков или вовсе ни одним. Желательно не упоминать статическую и динамическую типизацию, потому что это слишком на поверхности.

Например, я не знаю D и кое-как знаю Common Lisp. С языком D ознакомился по другим холиварным темам, сложилось следующее впечатление:

Я могу писать лучше любого, кто пишет быстрее меня, и быстрее любого, кто пишет лучше меня.
А. Дж. Либлинг

В частности, кажется, что у D нет фич, выгодно отличающих его от CL (размер бинарника не в счёт).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.03.2015, 03:11
Ответы с готовыми решениями:

Common Lisp vs D (2)
Продолжение темы.

C++ vs Common Lisp: кодогенерация, метапрограммирование
Дано описание произвольного математических выражений на XML вида: <calc> <mul> <var>k</var> ...

Книги или другой источник, где описана история версий Lisp и Common Lisp
Доброго времени суток.Такой вопрос,знаете какой-нибудь источник,где описана история версий Lisp и Common Lisp.Только не всякие...

1012
 Аватар для nullxdth
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
13.03.2015, 03:23
Начнём с простого, рассмотрим факториал в CT на Common Lisp:
Lisp
1
2
3
4
5
6
7
8
(eval-always
  (defun factorial (n)
    (if (< n 1)
        1
        (* n (factorial (1- n))))))
 
(define-compiler-macro factorial (&whole whole n)
  (if (constantp n) (factorial n) whole))
Функция factorial доступна как в CT, так и в RT.
Когда compile-file встретит форму (factorial n), то её обработка будет передана одноимённой макрофункции компилятора. Если n - константа [например, (factorial 10)], то факториал будет вычислен в CT и в откомпилированном коде будет числовой литерал - результат факториала, иначе макроформа будет отображена сама в себя (останется в первоначальном виде), т.е. факториал будет вычислен в RT.

Понятно, что реализовать этот долбаный факториал подобным образом можно как в D, так, например, и в C++. Но чуть усложним пример, напишем мемоизированную версию:
Lisp
1
2
3
4
5
6
7
8
9
(eval-always
  (defparameter *factorial-cache* (make-hash-table))
  (defun factorial (n)
    (if (< n 1)
        1
        (setf (gethash n *factorial-cache*) (* n (factorial (1- n)))))))
 
(define-compiler-macro factorial (&whole whole n)
  (if (constantp n) (factorial n) whole))
Тут переменная *factorial-cache* доступна и в CT, и в RT. Причём в окружении компилятора свой *factorial-cache*, а в RT - свой. Тем самым мы мемоизируем как и вычисления в CT (на константах), так и в RT.

Как подобную функциональность реализовать в D?
0
 Аватар для nullxdth
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
13.03.2015, 03:27
Фак Common Lisp vs D
0
13.03.2015, 03:29  [ТС]

Не по теме:

Просим модераторов объединить темы!

0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
13.03.2015, 03:50
Цитата Сообщение от nullxdth Посмотреть сообщение
(1- n)
А это что такое? Новый вид польской записи: урфиксная?
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
13.03.2015, 03:54  [ТС]
Обыкновенная запись. Как можно догадаться и по коду, 1- — функция, отнимающая единицу. К сожалению, её нельзя было назвать -1, потому что ридер прочитает это как число минус один.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
13.03.2015, 03:57
Мемоизация - эта самая простая часть языка D :
C++
1
2
3
4
5
6
7
ulong fact(ulong n)
{
    alias mfact = memoize!fact;
    return n < 2 ? 1 : n * mfact(n - 1);
}
...
assert(fact(10) == 3628800);
0
 Аватар для nullxdth
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
13.03.2015, 04:05
И это работает в CT?
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
13.03.2015, 04:17
Цитата Сообщение от nullxdth Посмотреть сообщение
И это работает в CT?
Нет.
0
 Аватар для nullxdth
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
13.03.2015, 04:19
О чем и речь. 1:0?
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
13.03.2015, 04:30
Цитата Сообщение от nullxdth Посмотреть сообщение
О чем и речь. 1:0?
Жди.
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
13.03.2015, 09:21

Не по теме:

Это уже куда интереснее, чем C++ vs D. Пошёл за попкорном


D как бы пытается поддерживать функциональный стиль, и во многом это ему удаётся.

Добавлено через 10 минут

Не по теме:

Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Жди.
Догадываетесь где можно узнать ответ Dennis-a прежде, чем он его опубликует в этой теме? :D



Добавлено через 6 минут

Не по теме:

Rikki Cattermole автор книги "Developing with compile time in mind" пишет, отвечая Dennis-y

If you haven't already, I would strongly recommend that you read my book
on the subject.
Так и хочется спросить "Зачем покупать твою книгу, если можно спросить обо всём на форуме" :D
да и Ali Çehreli нужно сначала прочитать, там хоть некоторые главы на русский переведены



У меня такой вопрос: на Lispe можно реализовать клиент-серверные приложения? А p2p сеть?

PS Немного почитал про Lisp, статья http://habrahabr.ru/post/104349/ говорит о том, что компиляторы до 2010 года опеспечивали слабую
Кликните здесь для просмотра всего текста

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

портируемость для разных популярных десктопных ОС. Что скажите? Изменилось что нибудь с 2010 года?

неее ребята... чего то вы тут темните по крупному... с Common Lisp

Ленивые вычисления Common Lisp не поддерживает...

Добавлено через 6 минут
Сборщик мусора в Common Lisp не отключается...
Есть ли возможность в Common Lisp делать ассемблерные вставки? [правда я ими никогда не пользуюсь]

Добавлено через 49 минут
Давайте начнём всё сначала, вы [лисперы] все реально считаете, что запись (or (= i j) (= k l)) понятнее, чем ((i==j) || (k==l))? Или есть те кто сомневаются?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
13.03.2015, 09:31
Цитата Сообщение от XRuZzz Посмотреть сообщение
на Lispe можно реализовать клиент-серверные приложения?
Да, как и на любом другом языке общего назначения.

Цитата Сообщение от XRuZzz Посмотреть сообщение
А p2p сеть?
Да, как и на любом другом языке общего назначения.

Цитата Сообщение от XRuZzz Посмотреть сообщение
что компиляторы до 2010 года обеспечивали слабую
Привет тебе из будущего. У нас 2015-й год, Путин снова президент и куча всего произошло.

Цитата Сообщение от XRuZzz Посмотреть сообщение
Ленивые вычисления Common Lisp не поддерживает...
Что значит «не поддерживает»? Рекомендую почитать SICP главу про потоки (Streams).

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

Цитата Сообщение от XRuZzz Посмотреть сообщение
Сборщик мусора в Common Lisp не отключается...
Зачем его отключать?

Цитата Сообщение от XRuZzz Посмотреть сообщение
Есть ли возможность в Common Lisp делать ассемблерные вставки?
Зависит от реализации. В стандарте языка этого нет по понятным причинам.

Цитата Сообщение от XRuZzz Посмотреть сообщение
правда я ими никогда не пользуюсь
То-то и оно, ими никто не пользуется.

Добавлено через 2 минуты
Цитата Сообщение от XRuZzz Посмотреть сообщение
Давайте начнём всё сначала, вы [лисперы] все реально считаете, что запись (or (= i j) (= k l)) понятнее, чем ((i==j) || (k==l))?
1) Во многих случаях — да. Особенно, когда операндов больше двух.
2) Это довольно маленькая цена за гомоиконный синтаксис и простоту обработки и генерации кода.
3) Синтаксисом заморачиваются, обычно, недалёкие люди.

Впрочем, для любителей есть пакеты, реализующие инфиксную запись.
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
13.03.2015, 09:41
А далёким людям наплевать на то, что синтаксис без серьёзных причин неудобный?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
13.03.2015, 09:47
Цитата Сообщение от XRuZzz Посмотреть сообщение
что синтаксис без серьёзных причин неудобный?
— вот это фраза недалёкого человека. =)
1) Есть вполне серьёзные причины.
2) Достаточно удобный, проблем не вызывает.
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
13.03.2015, 09:48
Я просто как недалёкий человек, не понимаю зачем нужен такой синтаксис.... только потому что компиляторам так проще обрабатывать?

Добавлено через 1 минуту
Цитата Сообщение от korvin_ Посмотреть сообщение
Есть вполне серьёзные причины.
которые вы тщательно скрываете.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
13.03.2015, 09:59
Цитата Сообщение от XRuZzz Посмотреть сообщение
которые вы тщательно скрываете.
Ничего не скрываем, всё на виду!

Цитата Сообщение от korvin_ Посмотреть сообщение
простота обработки и генерации кода.
Добавлено через 35 секунд
Цитата Сообщение от XRuZzz Посмотреть сообщение
только потому что компиляторам так проще обрабатывать?
Не столько компиляторам, сколько людям. Программно.
0
Антикодер
Эксперт функциональных языков программирования
1888 / 870 / 48
Регистрация: 15.09.2012
Сообщений: 3,088
13.03.2015, 10:30

Не по теме:

Dennis Ritchie скорее просыпайся, а то я скоро усну и не кому будет отстаивать D :D



Добавлено через 11 минут
Цитата Сообщение от helter Посмотреть сообщение
В частности, кажется, что у D нет фич, выгодно отличающих его от CL (размер бинарника не в счёт).
Так и обратное тоже верно, у CL нет фич, выгодно отличающих его от D, тока у D приятные маленькие бинарники.

Добавлено через 40 секунд
Вывод: Dшникам, можно не заморачиваться с изучением Lisp
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
13.03.2015, 13:13
Цитата Сообщение от XRuZzz Посмотреть сообщение
А далёким людям наплевать на то, что синтаксис без серьёзных причин неудобный?
Скобочки ихнаше всё!

Добавлено через 1 час 21 минуту
Цитата Сообщение от nullxdth Посмотреть сообщение
Тут переменная *factorial-cache* доступна и в CT, и в RT. Причём в окружении компилятора свой *factorial-cache*, а в RT - свой. Тем самым мы мемоизируем как и вычисления в CT (на константах), так и в RT.
В плюсах при развёртывании шаблонов мы итак получаем конкретные подстановки, можно сказать кеширование результатов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <int n>
struct Factorial
{
    enum { value = n * Factorial<n - 1>::value };
};
 
template <>
struct Factorial<0>
{
    enum { value = 1 };
};
 
int main()
{
    constexpr auto x = Factorial<5>::value;
    constexpr auto y = Factorial<7>::value;
}
При вычислении Factorial<7> будут использованы результаты, полученные при развёртывании рекурсии от Factorial<5>. Единственное правило - вызов должен происходить в одной единицы трансляции.
0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
13.03.2015, 13:13
Цитата Сообщение от XRuZzz Посмотреть сообщение
все реально считаете, что запись (or (= i j) (= k l)) понятнее, чем ((i==j) || (k==l))
хм... напоминает плачь школьника. А запись 2 + ... + n понятнее чем + 2 ... n? Отвечать не нужно. Вы как специалист не должны обращать внимания на такие мелочи. Они могут показаться неудобными, но привыкнуть к ним - дело нескольких часов практики. Претензии к синтаксису лиспа просто смешны. Более простой синтаксис можно найти только в эзотерике, а среди известных ЯП общего назначения это самый аскетичный синтаксис с минимумом семантических правил и специальных символов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.03.2015, 13:13
Помогаю со студенческими работами здесь

Common lisp
кто поможет решить эти задачи? Перечитайте правила форума. Один вопрос - одна тема. Заголовок темы должен быть осмысленным и...

Common lisp
Есть фрагмент программы: (defun game(x y) (cond (( &lt; x y)(print &quot;menshe&quot;)(setq y (read))) (( &gt; x y)(print &quot;bolshe&quot;)(setq y...

Common Lisp
Подскажите пожалуйста, а может Common Lisp формировать списки из функций, и (если вдруг может) как?

ООП Common Lisp
Помогите пожалуйста! Реализовать класс: Программа (название, тип, сфера применения, язык программирования, ...) Класс должен иметь...

Вопрос по common lisp
Подскажите пожалуйста как выполнить лисп-программу из txt или какого другого файла?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru