Форум программистов, компьютерный форум, киберфорум
Священные войны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/195: Рейтинг темы: голосов - 195, средняя оценка - 4.94
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
13.03.2015, 14:45  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от nullxdth Посмотреть сообщение
Забавно. Можно ссылку?
Что-то не гуглится, не помню, где видел. Но точно читал, и именно после этого я сам перестал ставить на бумаге лишние скобки. Мне кажется, это единственный реальный способ писать лисп на бумаге.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.03.2015, 14:45
Ответы с готовыми решениями:

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

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

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

1012
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
13.03.2015, 14:55
Цитата Сообщение от helter Посмотреть сообщение
Мне кажется, это единственный реальный способ писать лисп на бумаге.
А, блин. Я подумал что это let реализованный в python
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
13.03.2015, 15:37
Цитата Сообщение от XRuZzz Посмотреть сообщение
Что значит генерировать?
То и значит.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
13.03.2015, 16:04
Фейл лиспарей:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int factorial(int n)
in
{
    assert(n >= 0, "n cannot be 0");
}
body
{
    return n == 0 ? 1 : n * factorial(n - 1);
}
 
void main()
{
    //Evaluated at compile time
    enum x = factorial(5);
    
    //Evaluated at runtime
    auto y = factorial(7);
}
P.S. C++ тоже курит со своим непонятным шаблонным кодом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
template Factorial(int n)
{
    static if (n == 0)
    {
        enum Factorial = 1;
    }
    else static if (n > 0)
    {
        enum Factorial = n * Factorial!(n - 1);
    }
    else
    {
        static assert(false, "n cannot be negative");
    }
}
 
int main()
{
    //Calculated at compile time
    auto x = Factorial!5;
    auto y = Factorial!7;
}
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
13.03.2015, 16:07
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Фейл лиспарей
И что это за говно? Где мемоизация-то? Ты думаешь, если подсунуть ссаные контракты вместо мемоизации никто не заметит?
0
Антикодер
Эксперт функциональных языков программирования
1889 / 871 / 48
Регистрация: 15.09.2012
Сообщений: 3,092
13.03.2015, 16:14
Цитата Сообщение от nullxdth Посмотреть сообщение
И что это за говно? Где мемоизация-то? Ты думаешь, если подсунуть ссаные контракты вместо мемоизации никто не заметит?
Мы же остановились на Common Lisp vs D
Или вас не устраивает, что нет мемоизации в RT? Так тут она вроде и не нужна.
0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
13.03.2015, 16:28
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Фейл лиспарей
Шулерство не красит. Вы пойманы за руку, стреляйтесь.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
13.03.2015, 16:33  [ТС]
Попробую кратенько написать про состояния в лиспе. Сразу предупреждаю, это сложнее, чем hello world. Если что, вот в книге доходчиво написано:
http://www.gigamonkeys.com/boo... tarts.html
и по-русски, хотя перевод несколько надмозговый.
http://lisper.ru/pcl/beyond-ex... d-restarts

Предположим, мы желаем парсить какие-то логи. Главных действующих лиц трое: функции parse-log-entry ― парсит одну запись, parse-log-file ― парсит в цикле записи, содержащиеся в файле, и log-analyzer, которая является точкой входа и определяет логику высокого уровня.

В чём состоит проблема. Записи могут быть повреждённые. Функция parse-log-entry самая низкоуровневая, она не должна никак бороться с повреждёнными записями. Она должна генерировать ошибку ― скажем, специального класса malformed-log-entry-error. Но ошибки иногда можно исправить ― например, использовать заданное пользователем значение или перепарсить запись с исправленным текстом. Ещё раз отмечу, что parse-log-entry не может сама выбирать стратегию исправления ошибки, не её ума дело, но она на своём низком уровне может реализовать возможные стратегии исправления. Код выглядит примерно так:
Lisp
1
2
3
4
5
6
(defun parse-log-entry (text)
  (if (well-formed-log-entry-p text)
    (make-instance 'log-entry ...)
    (restart-case (error 'malformed-log-entry-error :text text)
      (use-value (value) value)
      (reparse-entry (fixed-text) (parse-log-entry fixed-text)))))
Если запись плохая, наверх по стеку отправляется ошибка malformed-log-entry-error, содержащая плохой текст, и если сверху придут указания вернуть значение value или перепарсить с пофикшенным текстом, реализованы соответствующие способы исправления ошибки. Ещё раз: с случае непредвиденной ситуации генерируется ошибка и всё; вместе с тем, реализованы способы исправления ошибки, если надо.

Теперь файл.
Lisp
1
2
3
4
5
6
(defun parse-log-file (file)
  (with-open-file (in file :direction :input)
    (loop for text = (read-line in nil nil) while text
          for entry = (restart-case (parse-log-entry text)
                        (skip-log-entry () nil))
          when entry collect it)))
Видите, скобок немного. Здесь в цикле разбираются записи и собираются в список. Вместе с тем предлагается ещё одна стратегия исправления ошибки: если будет на то указание сверху (по стеку), испорченные логи можно просто игнорировать.

Простейшая и не совсем хорошая версия функции log-analyzer выглядит так:
Lisp
1
2
3
4
5
6
(defun log-analyzer ()
  (handler-bind ((malformed-log-entry-error
                  #'(lambda (c)
                      (invoke-restart 'skip-log-entry))))
    (dolist (log (find-all-logs))
      (analyze-log log))))
Здесь analyze-log каким-то способом использует parse-log-file и делает что-то с логами, неважно. Если какой-то лог испорчен, log-analyzer говорит, что его нужно скипнуть. Причём ― внимание! ― стек не разматывается. Если вспомнить, ошибка возникает в середине цикла, крутящегося в parse-log-file, но когда генерируется ошибка, её отлавливает log-analyzer и возвращает управление обратно вниз, в точку ошибки, с указаниями к исправлению. То есть всякие try: except не сработали бы, потому что они разматывают стек.

Если бы мы хотели, чтобы повреждённые записи превращались бы, например, в объекты класса malformed-log-entry, мы бы написали log-analyzer так:
Lisp
1
2
3
4
5
6
7
(defun log-analyzer ()
  (handler-bind ((malformed-log-entry-error
                  #'(lambda (c)
                      (use-value
                       (make-instance 'malformed-log-entry :text (text c))))))
    (dolist (log (find-all-logs))
      (analyze-log log))))
Общая идея. При работе с ошибками в CL различаются три уровня кода: низкий уровень, генерирующий ошибку и не думающий об исправлении, высокий уровень, который отлавливает ошибки и указывает стратегию исправления ошибки, и средний, который осуществляет исправление.

Добавлено через 3 минуты
Цитата Сообщение от XRuZzz Посмотреть сообщение
Мы же остановились на Common Lisp vs D
Претензия в том, что в D нет побочных эффектов в CT. Если так, это правда большой фейл.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
13.03.2015, 16:35
Т.е. всё это хвалёное «CT-программирование» в D ограничивается фаториалами и прочими фиббоначами? =)
Так и запишем: D — обычная поделка «академистов». =)
0
Антикодер
Эксперт функциональных языков программирования
1889 / 871 / 48
Регистрация: 15.09.2012
Сообщений: 3,092
13.03.2015, 17:00
Можете кратко объяснить почему побочные эффекты в CT это хорошо, и что вы под ними подразумеваете.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
13.03.2015, 17:15
Цитата Сообщение от XRuZzz Посмотреть сообщение
Можете кратко объяснить почему побочные эффекты в CT это хорошо
Побочные эффекты — это не «хорошо» или «плохо» (что вообще могут означать эти «характеристики»?), а так, то же, что и в RT.

Цитата Сообщение от XRuZzz Посмотреть сообщение
и что вы под ними подразумеваете
То же, что и все.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
13.03.2015, 17:26
Цитата Сообщение от korvin_ Посмотреть сообщение
То же, что и все.
Как-то так:
Цитата Сообщение от Voivoid Посмотреть сообщение
Так запость тезисы, мы заценим. А то дать ссылку любой может
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
13.03.2015, 17:45
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Как-то так:
Угу, типа нет никакой разнцы между почти часовым видео и маленькой статейкой которую за пару минут можно прочитать
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
13.03.2015, 17:59
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
P.S. C++ тоже курит со своим непонятным шаблонным кодом:
То, что он вам не понятен не делает его нерабочим.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
13.03.2015, 18:15
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Как-то так
Ок, побочный эффект — это изменение состояния окружения (внешнего по отношению к рассматриваемому коду). Т.е. практически любое использование оператора присваивания, работа с вводом/выводом и т.п. Например:

Lisp
1
2
3
4
5
6
7
8
9
(define state 1)
 
(define (foo n)
  (set! state (+ state n))
  (let ((x 2))
    (define (bar) (* x 2))
    (for ((_ (in-range n))) 
      (set! x (bar)))
    (list 'x= x 'state= state)))
Lisp
1
2
3
4
5
6
(foo 5)
; => '(x= 64 state= 6)
(foo 3)
; => '(x= 16 state= 9)
(foo 3)
; => '(x= 16 state= 12)
Если рассматривать процедуру foo, то state является для неё внешним состоянием, которое может изменяться, иметь разные значения в разные моменты времени. При двух вызовах foo с одним и тем же аргументом (3) мы получили два разных результата state: 9 и 12 соответственно. Это изменение и является побочным эффектом, причём производимым самой процедурой foo

Но изменение x внутри foo не является побочным эффектом относительно foo, т.к. не влияет на её результат: в обоих вызовах foo с одним аргументом мы получили одинаковое значение x.

Однако если же рассматривать процедуру bar, то её результат зависит от значения x, т.е. для неё изменение x является побочным эффектом, хотя и не она его производит.
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
13.03.2015, 18:15
Цитата Сообщение от MrGluck Посмотреть сообщение
То, что он вам не понятен не делает его нерабочим.
Он абсолютно понятен, для марсиан.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
13.03.2015, 19:12  [ТС]
Цитата Сообщение от XRuZzz Посмотреть сообщение
Можете кратко объяснить почему побочные эффекты в CT это хорошо, и что вы под ними подразумеваете.
Ну вот отдельные люди утверждают, что круто, дескать, что D позволяет выполнять какие-то вычисления в CT. На деле оказывается, что в CT присутствует только огрызок языка, в котором даже присваивания нельзя делать. В лиспе весь язык присутствует всегда, в том числе в CT. Это значит, что вычисления в CT в лиспе сделаны давно и лучше (tm), чем в D.

Добавлено через 1 минуту
Взять что попроще. Я посмотрел страницу про функции.
http://dlang.org/function.html
Не нашёл про именованные аргументы. Нету?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
13.03.2015, 19:41
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Он абсолютно понятен, для марсиан.
Так D'шники же марсиане и есть, разве нет?
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
13.03.2015, 20:28
Цитата Сообщение от helter Посмотреть сообщение
Не нашёл про именованные аргументы. Нету?
Чего такое именованные аргументы?
Цитата Сообщение от korvin_ Посмотреть сообщение
Так D'шники же марсиане и есть, разве нет?
Да.
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
13.03.2015, 20:32
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Чего такое именованные аргументы?
Лол
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.03.2015, 20:32

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

Common lisp
Есть фрагмент программы: (defun game(x y) (cond (( < x y)(print "menshe")(setq y (read))) (( > x y)(print "bolshe")(setq y...

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Закрытая тема Создать тему
Новые блоги и статьи
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru