Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP Оформление кодов

LISP Оформление кодов

Ответ
Поиск в этой теме
Непрочитано 11.01.2011, 20:08
LISP Оформление кодов
VVA
 
Инженер LISP
 
Минск
Регистрация: 11.05.2005
Сообщений: 6,991

На сайте Lee Mac опубликован LISP Styler для оформления кодов перед публикацией на форумах или html страницах.
Пример использования команды lsp2bbc c цветовой схемой, предложенной автором (код для примера взят отсюда )
Код:
[Выделить все]
(defun str->list (s)
                 ;|
***************************************************************************************
*
* Программа разделяет строку на список текстовых и цифровых составляющих.
* Запятая между цифрами, зменяется на точечный разделитель дробной части.
* 
**************************************************************************************
*
* Написал Елпанов Евгений       (ElpanovEvgeniy)
*
* дата создания (13/10/2007 a 11:42)
* написано во время конкурса на форуме:
* http://www.cadxp.com/XForum+viewthread-fid-101-tid-16943-page-2.html
***************************************************************************************
* Пример использования и результатов работы:
* (str->list "point.25.4cm.")           => ("point." 25.4 "cm.")
* (str->list "point.25,4cm.")           => ("point." 25.4 "cm.")
* (str->list "point.3/8cm.")            => ("point." 0.375 "cm.")
* (str->list "qvf12qsdf125 5sf 56dfv2") => ("qvf" 12 "qsdf" 125 " " 5 "sf " 56 "dfv" 2)
***************************************************************************************
 |;
 (defun str->list1 (a b f)
  (cond
   ((null b)
    (list (if f
           (cond ((vl-position 46 a) (atof (vl-list->string (reverse a))))
                 ((vl-position 47 a) (distof (vl-list->string (reverse a))))
                 ((vl-position 44 a) (atof (vl-list->string (subst 46 44 (reverse a)))))
                 (t (atoi (vl-list->string (reverse a))))
           )
           (vl-list->string (reverse a))
          )
    )
   )
   (f
    (if (or (= (car b) 44) (< 45 (car b) 58))
     (str->list1 (cons (car b) a) (cdr b) f)
     (cons (cond ((vl-position 46 a) (atof (vl-list->string (reverse a))))
                 ((vl-position 47 a) (distof (vl-list->string (reverse a))))
                 ((vl-position 44 a) (atof (vl-list->string (subst 46 44 (reverse a)))))
                 (t (atoi (vl-list->string (reverse a))))
           )
           (str->list1 (list (car b)) (cdr b) nil)
     )
    )
   )
   (t
    (if (< 47 (car b) 58)
     (cons (vl-list->string (reverse a)) (str->list1 (list (car b)) (cdr b) t))
     (str->list1 (cons (car b) a) (cdr b) nil)
    )
   )
  )
 )
 (setq s (vl-string->list s))
 (str->list1 (list (car s))
             (cdr s)
             (if (or (= (car s) 44) (< 45 (car s) 58))
              t
             )
 )
)

Вложения
Тип файла: lsp lisp styler.lsp (19.4 Кб, 94 просмотров)

__________________
Как использовать код на Лиспе читаем здесь
Просмотров: 15738
 
Непрочитано 12.01.2011, 13:58
#21
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Евгению:
Вот что меня меньше всего "парит" - так это потеря производительности от рекурсии. При использовании рекурсий я смотрю только на отстуствие хвостовой оптимизации (влезает ли в стек предпологаемое множество итераций) - к сожалению есть такой недостаток автолиспа. Я убежден, что если дать одну и ту же более-менее сложную общую задачу 2 отдельным программистам и попросить одного писать в функциональном стиле, а другого в императивном, то их производительность будет в среднем одинакова (а реализации алгоритмов несколько отличатся - каждый с уклоном в "свою" сторону). Да если переписать готовую "функционально-рекурсивную" программу в императивном стиле - выйгрыш будет (на самом деле лиспы посерьезней делают это автоматически - и упомянутая хвостовая оптимизация тому пример), но он будет не значителен, программа потеряет "лекгость изменений" и самое главное изначально в императивном стиле ее так не напишешь (я точно не напишу) т.к. логика подходов все-таки разная.

p.s. - на производительность автолиспа я смотрю так, либо задача решатся - нажал-результат, либо надо серьезно задуматся - тот-ли инструмент используется т.к. выйгрыш от использование итераций лежит в пределах нескольких процентов - то для юзера абсолютно все равно 0.1 или 0.12 секунды ушло на обработку данных. А если задача требует серьезных вычислений и должна производится быстро - тут стоит посмотреть в первую очередь на алгоритм, а если с ним уже ничего не сделать - то в сторону инструментов действительно убыстряющих процесс вычислений в разы - dll(Net), либо отдельный EXE.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 12.01.2011, 14:29
#22
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Потому как, по подсветке я понимаю, что правильно написал название функции. А так может получиться, что префикс написан правильно, по маске название подходит и подсвечивается, а такой функции не существует!
Так это же надо с умом делать. То, что имя функции подсвечено, еще не значит, что она существует и доступна. Она всего лишь в списке ключевых слов (я говорю не про VLIDE, там vla- не перечислены, а автоматически подсвечиваются из-за наличия регистрации TLB, это только плюс для VLIDE).

А для разных масок в приличном редакторе можно установить и разные цвета.

Например, у меня свои функции имеют одну раскраску, функции от kpblc - другую. Различаются "низкоуровневые" и "высокоуровневые". Это очень облегчает работу.


Цитата:
А переменных у меня давно в коде не встречается (я уж не раз про это писал) Вот последний пример - ну удобней мне так
Это скорее понты, чем удобство. Да, замечательный пример - всё "по-лисповски". Никаких переменных. Но доведись с этим разбираться кому-то другому - замучается. А если это фирма, а не "вольный художник"?

Конечно, без лишних переменных надо обходиться. Но с умом. Самое тяжелое - отладка. Вот здесь переменные помогут. Потом код можно оптимизировать, избавиться от переменных.
ShaggyDoc вне форума  
 
Непрочитано 12.01.2011, 14:40
#23
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Мэтр - клянусь Вам - у меня есть "библиотечка" своих функций - когда я смотрю на те функции, что были написанны с использованием переменных - мне в них гораздо тяжелей понять СВОЮ-ЖЕ логику, нежели в "лямбдовых".
Если нет переменных - отладки на порядок меньше (т.к. самая большая "неразбериха" как правило из-за них и происходит).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 12.01.2011, 20:28
#24
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


А мдшву имеет подсветку переменных? Как notepad++
Цитата:
Если нет переменных - отладки на порядок меньше
а параметров функций у вас столько же сколько и локальных переменных... + программа вывернута через ж*** ... Но вы так привыкли и такой подход имеет место быть... И даже иногда красиво получается... но для известных мне редакторов что параметр, что и локальное переменное, все едино

Последний раз редактировалось gomer, 12.01.2011 в 20:35.
gomer вне форума  
 
Непрочитано 13.01.2011, 00:02
#25
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Под словом переменная подразумвается обозначние меняющее свое значение в ходе программы (если аргумент всегда одинаков - то его и "отлавливать" не нужно - что не скажешь про переменные). Насчет вывернутости - давайте говорить обоснованно.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 13.01.2011, 00:28
#26
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


1. Вариант легкий для восприятия:
Код:
[Выделить все]
(defun myfun (a1 a2) тело функции); определяем функцию.
(myfun arg1 arg2); и вызываем её.
2. Вариант "всё то же самое, но в одну кучу":
Код:
[Выделить все]
((lambda (a1 a2 ) тело функции )  arg1 arg2)
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 13.01.2011, 01:07
#27
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Дима_ Посмотреть сообщение
Под словом переменная подразумвается обозначние меняющее свое значение в ходе программы (если аргумент всегда одинаков - то его и "отлавливать" не нужно - что не скажешь про переменные)
Код:
[Выделить все]
((lambda (x) 
  (setq x 0)
  (/ 21 x))
13
)
gomer вне форума  
 
Непрочитано 13.01.2011, 01:18
#28
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


у меня нет оператора присваивания setq - поэтому и нет перемных (не надо отлавливать в каком состоянии использутся переменная).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 13.01.2011, 01:19
#29
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Как тогда организовать сложные циклы с ветвлениием???
gomer вне форума  
 
Непрочитано 13.01.2011, 01:27
#30
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


лекго - см. пример из #19. если не понятно - приведи свой
p.s. более того - как раз в "циклах с ветвлением" и всплывает "запутка" с переменными - надо в каждой подветке учесть откуда она могла "приветвится" и что сейчас творится с перемнной (или наделать на каждую комбинацию свою перемнную - а это как правило совсем не мало).
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 13.01.2011 в 01:34.
Дима_ вне форума  
 
Непрочитано 13.01.2011, 02:11
#31
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


По просьбе Евгения выкладываю SciTE. Сборка ruboard + моя доработка добавил лексический анализатор языка apdl и еще чего-то не помню.
На лучший редактор не претендую, но с влайд не дружу.
1) ненавижу отладку - и в итоге ей не пользуюсь.
2) много тупых вещей типа окно трассировки нужно закрывать постоянно.
SciTE - не требует установки, распространяется по GPL.
Полностью настраивается с помощью скриптов - разбираешься в существующих скриптах (коментариях) и делаешь по образу и подобию, так можно добавлять свои элементы в падающее меню, назначать сочетание клавишь и т.п. А в данный момент пишу под брикс а потом адаптирую под акад, уже стал получаться сразу кроссплатформенный код.
Вложения
Тип файла: rar SciTE.rar (1.49 Мб, 73 просмотров)
Sleekka вне форума  
 
Непрочитано 13.01.2011, 02:19
#32
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Дима_ Посмотреть сообщение
лекго - см. пример из #19
Я там понял только, что проверики на esc нет, но есть проверка на пустой выбор (if lst ... Не логично... эту лямбду надо было птратить на документ
gomer вне форума  
 
Непрочитано 13.01.2011, 09:26
#33
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Дима_, в параллельной ветке, вы сказали:
Цитата:
Сообщение от Дима_ Посмотреть сообщение
Offtop: (defun soddi_circle (e1 e2 e3 / A A1 B B1 C C1 D D1 R R1 R2 R3 X X1 X2 X3 Y Y1 Y2 Y3) - Евгений Вы меня пугаете
Попробуйте переписать без переменных или значительно сократив их количество. Я не со зла, просто действительно, не всегда код будет проще и легче.
__________________
Чем гениальнее ваш план, тем меньше людей с ним будут согласны.
/Сунь Цзы/
Елпанов Евгений вне форума  
 
Непрочитано 13.01.2011, 11:18
#34
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от gomer Посмотреть сообщение
Я там понял только, что проверики на esc нет, но есть проверка на пустой выбор (if lst ... Не логично... эту лямбду надо было птратить на документ
Про документ согласен это - копипаст но т.к. эти две функции вызываются 1 раз - этим можно и пренебречь. Про пустой выбор - вы ничего не поняли - эта функция вызывает сама себя пока не кончатся необработанные окружности и пустой список означает конец рекурсии - весь смысл в том что не нужно перебирать каждый к каждому - (поэтому я здесь и не использовал mapcar), а в том - что если круг один раз уже обработан (прочерчен) - то проверять его больше не надо (отдельно для горизонталей и вертикалей) - и следуящая итерация вызывается уже без него.

Евгению - у Вас нет ни одного значения меняющего свое состояния (переменной) - да алгоритм имеет много имен - как их обозначить через
(defun xxx ( / a b c) (setq a 1 b 2 c 3)(XXX)) или
((lambda (a b c)(XXX)) '(1 2 3))
ИХМО разницы ни какой - мне удобней второй вариант - вот если бы Вы в цикле "крутили" переменными - там было-бы много мест где запутатся. У setq есть преимущество - сразу после определения имени - в том же операторе, его можно использовать, то есть - (setq a 5 b (* a 2)) вполне законен, такой отдельной "рекурсивной" лямбды в автолиспе не предусмотренно, но минус что перед тем как использовать переменную - ее неплохобы вынести в локальные - это как правило делают непосредственно в defun'е (лямбды отдельно для обозначения писать нет смысла - но если лямбда и так используется (например внутри mapcar'а) - то можно) и в этом и есть "камень преткновения" - если мы используем эту переменную (именно как переменую) - надо всегда четко осознавать из какого места программы вызывается функция используящая ее и вот эти ошибки в "сложнозацикленной" программе замучаешся отлавливать с любым отладчиком. Я лет 15 программировал на "сугубо" императивном ассемблере - там количество именно переменных доходит до тысяч (плюс стек, плюс регистры). Когда перешел на функциональные языки - поверьте испытал "глубокое счастье" - стоит один раз "въехать" и обратно уже не хочется.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 13.01.2011, 11:24
#35
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Попробуйте переписать без переменных
А еще попробовал бы Дима_ написать не "академические" функции учебного плана, а реальную несложную функцию (которую можно завернуть и в "C:команду"). Например:

Рисование неких произвольных прямолинейных сегментов (наподобие команды LINE). Как именно рисуется "сегмент" - задается именем функции рисования, которое передается аргументом. У функции рисования должно быть два обязательных аргумента - точки начала и конца и, факультативно, какой-то список иных аргументов, которые она уже сама знает.

В частном случае, для простоты, это может быть просто отрезок. Но "главная" функция должна:

1. В цикле, до пустого ввода запрашивать точки начала (первый раз) и конца сегмента (до выхода).

2. При этом должны выводиться опции "Предыдущая Начало Откат". "Предыдущая" - это автоматическая привязка начала сегмента к предыдущей первой точке, а "Начало" - запрос новой первой точки. "Откат" - отмена только что нарисованного сегмента. "Предыдущая" точка может быть взята и из прежнего запуска этой программы.

3. Разумеется ввод должен быть защищен от возможных ошибок и недопустимых прерываний. Точки должны быть трехмерными.

4. После ввода очередной точки сегмент должен сразу отрисовываться.

Задача несложная. Пригодится абсолютно всем.

Вот и можно потренироваться и с переменными, и с лямбдами. Только должно работать без присутствия автора и даже у "обезьяны с гранатой".

Требований к форматированию кода и подсветке синтаксиса нет.
ShaggyDoc вне форума  
 
Непрочитано 13.01.2011, 11:34
#36
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Мэтр - Вы сомневаетесь что я сюда не смогу добавить vl-catch-all-apply?
p.s.Offtop: я не только тут автолиспом развлекаюсь, но и куда более реально пишу на коммерческой основе, а там не до академических понтов - т.к. за них отвечать придется материально.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 13.01.2011 в 11:51.
Дима_ вне форума  
 
Непрочитано 13.01.2011, 11:58
#37
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Цитата:
а там не до академических понтов - т.к. за них отвечать придется материально.
т.е. там у вас в коде перменные присутствуют?
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 13.01.2011, 12:04
#38
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


В незначительных количествах - есть моменты плохо (или вообще не) реализованные в автолиспе (замыкания, ограниченность рекурсии и пр.) - если задача выходит за установленные в автолиспе пределы - приходиться "мучатся", ну и естественно есть глобальные переменные. В не автолисп приложениях - только внутри объектов (ООП).
p.s. Короче для реализации алгоритмов я предпочитаю использовать не изменяемые состояния определителей. Достало меня уже объяснять - я никого здесь не уговариваю поступать так-же. Но прошу только - если не понятно как я пишу - не надо меня учить как писать императивно, чтоб вам было понятно - умею я это, но мне так не нравится. Если кто-то не понимает и хочет спросить в чем суть такого способа - другой вопрос.
p.p.s Только, не подумайте - мол изучил рекурсию и строит из себя умного - я многие вещи в автолиспе не знаю и переодически об этом здесь спрашиваю. Мне такой стиль больше по душе - это из разряда советов (или тем более "рьяных" споров) что вкусней - чай, кофе или какао.
__________________
Когда в руках молоток все вокруг кажется гвоздями.

Последний раз редактировалось Дима_, 13.01.2011 в 12:19.
Дима_ вне форума  
 
Непрочитано 13.01.2011, 14:34
#39
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Цитата:
Мэтр - Вы сомневаетесь что я сюда не смогу добавить vl-catch-all-apply?
Разумеется, не сомневаюсь. Твое мастерство в LISP не вызывает сомнений, я искренне восхищаюсь.

Я просто предлагаю написать конкретную программу. Не маленький фрагмент, а в целом, с конечным результатом. Сроками никак не ограничиваю, можно и через год. Только не говорить, что "если бы не Автолисп". И не как могу, а как надо. "ТЗ" могу уточнить. Чтобы не отвлекаться на исследования, могу помочь готовыми кусками - можешь оптимизировать "по лямбда-исчислению".

В своем стиле. А мы все поучимся. А ты её сможешь продавать на коммерческой основе.

Одна такая функция заменит десятки разношерстных программ.

Offtop: Сегодня на Хабре интересная заметка "Новый программерский жаргон". Известен термин "рефакторинг" (refactoring) - — процесс изменения внутренней структуры программы, не затрагивающий её внешнего поведения и имеющий целью облегчить понимание её работы.

И появился термин Рефукторинг (Refuctoring)

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

ShaggyDoc вне форума  
 
Непрочитано 13.01.2011, 14:53
#40
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
А ты её сможешь продавать на коммерческой основе.
Купите?
з.ы. Шучу конечно
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP Оформление кодов

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) Red Nova LISP 4555 24.03.2024 13:44
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33
Как создать lisp Тройника Boo87 LISP 25 16.08.2010 19:54
Запуск Lisp команды в новом документе BlackHarp LISP 1 26.03.2009 23:06
загрузка DOS прог через LISP Gaa LISP 15 12.08.2005 19:19