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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Непрочитано 20.07.2008, 20:12
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, Տ.Գ.Թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,980

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vl-catch-all-apply '(lambda () (vla-put-explodable blk_def :vlax-true)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
_____________________________________________________________________________________________________________

Прошло много лет и топик теперь представляет из себя площадку для обучения азов программирования для многих начинающих.
Так что начинающие лиспогрызы приветствуются .
__________________
Блог

Последний раз редактировалось Red Nova, 12.07.2017 в 05:43.
Просмотров: 1965790
 
Непрочитано 01.06.2011, 09:48
#1541
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Ubivec81 Посмотреть сообщение
Почему жуть? может что подскажите?
TararykovDG уже объяснил, немного дополню:
В лиспе вот это (/= <выражение> nil) в функциях проверки можно заменять на просто <выражение>:
(if (/= x nil) (alert "a") (princ "b")) то же самое, что (if x (alert "a") (princ "b")).
Цитата:
Сообщение от gomer Посмотреть сообщение
По хорошему... сначала (при выборе первого пикета) нужно давать юзеру возможность <Выход>а, при выборе последующих пикетов дать возможность <Завершить> выбор
Да, эта логика работы получше. У меня была цель в коде из #1533 показать более полно возможности INITGET. Ведь вместо "Выход" там можно разместить "Настройки" и другие опции. В своих же программах я, как правило, выход делаю по "холостому" нажатию Enter (потому и единичку в INITGET не ставлю) или Esc. Что лично мне сильно не нравится - это когда в коде дважды один и тот же запрос повторяется. К примеру: если в будущем придется править программу, нужно будет отыскивать все дублирующиеся запросы. Я б лучше как-то так сделал:
Код:
[Выделить все]
 (defun GetPiketList (/ piket piket_list)
  ;;(GetPiketList)
  (while (setq piket (progn (initget 6)
                (getreal (strcat "\nВведите пикет <"
                         (if piket_list
                           "Завершить"
                           "Выход"
                         ) ;_ end of if
                         ">: "
                     ) ;_ end of strcat
                ) ;_ end of getreal
             ) ;_ end of progn
     ) ;_ end of setq
    (if    (member piket piket_list)
      (prompt "\nПикет уже задан!")
      (setq piket_list (cons piket piket_list))
    ) ;_ end of if
  ) ;_ end of while
  (cond    (piket_list)
    ((prompt "\nНе задано ни одного пикета!"))
  ) ;_ end of cond
) ;_ end of defun

Последний раз редактировалось Do$, 01.06.2011 в 12:35.
Do$ вне форума  
 
Непрочитано 01.06.2011, 10:30
#1542
Дима_

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
В лиспе вот это (/= <выражение> nil) в функциях проверки можно заменять на просто <выражение>:
(if (/= x nil) (princ "a") (princ "b")) то же самое, что (if x (princ "a") (princ "b")).
Я бы написал (princ (if x "a" "b"))
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 01.06.2011, 10:48
#1543
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Да елы-палы Исправил.
Do$ вне форума  
 
Непрочитано 01.06.2011, 15:05
#1544
gomer

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Ведь вместо "Выход" там можно разместить "Настройки" и другие опции.
Какие такие настройки? Мы выбираем пикеты... все... Вообще лучше в данном случае применить диалог... вдруг у меня плохая память.. и я ввел 1000 раз тот же самый пикет...
gomer вне форума  
 
Непрочитано 01.06.2011, 15:52
#1545
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Я вставил initget и добавил в него ключевое слово, просто для примера - показать, что есть такая возможность. Чтобы подчеркнуть важность этой функции. Что ее очень полезно использовать перед вызовом get-функций. В ключевых словах может быть все что угодно: выход, настройки, последнее значение, удаление последнего введеного значения, очистка списка и ввод сначала, показать промежуточный список и пр... Словом, на что фантазии хватит. И не так уж важно: выбираем мы пикеты (точнее, не выбираем, а вводим) иль еще что-то делаем. Человек только учится программировать на автолиспе, возможно он не знает о такой возможности, потому я и показал ее, так как считаю ее очень полезной.
Цитата:
Сообщение от gomer Посмотреть сообщение
вдруг у меня плохая память.. и я ввел 1000 раз тот же самый пикет...
Память надо развивать, или лечить (в зависимости от обстоятельств). Но даже на такой запущенный случай в коде уже есть соответствующая проверка введеного значения на нахождение в списке. Программа 1000 раз выдаст подсказку "Пикет уже задан!".
Do$ вне форума  
 
Непрочитано 01.06.2011, 16:04
#1546
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


TararykovDG,
Цитата:
Сообщение от TararykovDG Посмотреть сообщение
я понимаю, что Ты наверное еще не особо усвоил лисп
Да я только начал все это постигать потому пишу как моей практики и ума хватает. Спасибо за помощь.
Вот только тут немного задача усложнилась:
Код:
[Выделить все]
 (setq X (+(*(getreal"\nПикет<Выход>-")10) (/(getreal "\nПлюс-")10)))
С вашим кодом Do$, я разобрался и понял что раньше просто не знал про эти связки, но прошу помочь все это применить к выше изложенному... Тут у меня при нажатии пустого ввода выходит что нету расчета X и программа на этом останавливается! Жду разъяснений.
Ubivec81 вне форума  
 
Непрочитано 01.06.2011, 16:17
#1547
gomer

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Я вставил initget и добавил в него ключевое слово, просто для примера - показать, что есть такая возможность. Чтобы подчеркнуть важность этой функции. Что ее очень полезно использовать перед вызовом get-функций. В ключевых словах может быть все что угодно: выход, настройки, последнее значение, удаление последнего введеного значения, очистка списка и ввод сначала, показать промежуточный список и пр...
я ж говорю диалог...
Цитата:
Сообщение от Do$ Посмотреть сообщение
Программа 1000 раз выдаст подсказку "Пикет уже задан!".
я говорю об отсутствии наглядности процесса...
код в #1541 на вид уж совсем оптимальный... и с точки зрения программиста и с точки зрения юзер... одно но... небольшая логическая ошибка... только выйти юзер может только первый раз, когда уже выбран хотя бы один пикет, можно либо выйти, либо завершить... По правилам хорошего тона Выход нужно перенести в опции, а Завершить оставить по умолчанию...
зы.. никаких промежуточных вычислений... ввел данные - считай, рисуй... не ввел... жуй кофе...
gomer вне форума  
 
Непрочитано 01.06.2011, 16:28
#1548
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


Я жутко извиняюсь. Но сейчас пытался как то все то что вы советовали применить на практике и понял что никак не пойму как это работатет
Код:
[Выделить все]
 (setq piket (progn (initget 6)
04	                (getreal (strcat "\nВведите пикет <"
05	                         (if piket_list
06	                           "Завершить"
07	                           "Выход"
08	                         ) ;_ end of if
09	                         ">: "
10	                     ) ;_ end of strcat
11	                ) ;_ end of getreal
12	             ) ;_ end of progn
13	     ) ;_ end of setq
можно на пальцах? лучше с расшифровкой по строкам! не понятно что есть "IF PIKET_LIST"это как читать??? и куда "Выход" девается при запуске кода?
Ubivec81 вне форума  
 
Непрочитано 01.06.2011, 16:51
#1549
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Ubivec81 Посмотреть сообщение
Жду разъяснений.
Да тут разъяснять нечего - при пустом вводе getreal возвращает nil, а математические функции * и / в качестве аргументов принимают только числа. А тут им nil подсовывают. Они дико обижаются и выдают ошибку
Тут надо сперва получить оба значения, потом их проверить, и, если оба являются числом (есть такая полезная функция numberp), проводить математические операции.
Как-то так:
Код:
[Выделить все]
 (if (numberp
      (setq x (progn (initget 4) (getreal "\nПикет<Выход>:")))
    ) ;_ end of numberp
  (if (numberp
    (setq y (progn (initget 6) (getreal "\nПлюс<Выход>:")))
      ) ;_ end of numberp
    (setq x (+ (* x 10.0) (/ y 10)))
  ) ;_ end of if
) ;_ end of if
Цитата:
Сообщение от Ubivec81 Посмотреть сообщение
не понятно что есть "IF PIKET_LIST"это как читать???
С лиспа это переводится так: "если piket_list не является пустым списком (nil) ..."
Код, надеюсь, пишешь во VLIDE? Если так, то в нем можно выражения отдельно запускать и смотреть, что будет получаться. Благодаря Кулик Алексею, об этом можно довольно доступно почитать тут http://autolisp.ru/category/ide/
Выражение (if piket_list "Завершить" "Выход") вернет строку "Завершить", если список piket_list непустой или "Выход", если наоборот.
Do$ вне форума  
 
Непрочитано 01.06.2011, 16:53
#1550
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Цитата:
что есть "IF PIKET_LIST"
,
Если список с именем piket_list уже есть, то выполняется выражение "Завершить", если его нет, то "Выход".
Здесь показана синтаксическая запись оператора if:
(if <условие> <выражение1> <выражение2>)
Если условие истинно, то выполняется выражение1, если ложно - то выражение2.
Поскольку при первом вызове список пикетов еще не создан, то можно выйти из программы - поэтому написан Выход,
когда список из пикетов уже есть и заполняется(-нен), то программу можно завершить - написано Завершить.
alex8888 вне форума  
 
Непрочитано 01.06.2011, 17:55
#1551
Дима_

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
С лиспа это переводится так: "если piket_list не является пустым списком (nil) ..."
Опять я влезаю (nil) это не пустой список, а волне себе список с пустым списком внутри - пустой список это nil либо () либо '().
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 01.06.2011, 23:03
#1552
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


Do$,
Цитата:
Сообщение от Do$ Посмотреть сообщение
Да тут разъяснять нечего - при пустом вводе getreal возвращает nil, а математические функции * и / в качестве аргументов принимают только числа. А тут им nil подсовывают. Они дико обижаются и выдают ошибку
Это я и сам понял, только не сообразил как все это провернуть. Спасибо за совет! помогло и вот что получилось
Код:
[Выделить все]
 (setq x t)
(while (/= x nil) (if (numberp
      (setq x (progn (initget 4) (getreal "\nПикет<Выход>:")))
    ) ;_ end of numberp
  (if (numberp
    (setq y (progn (initget 4) (getreal "\nПлюс<Выход>:")))
      ) ;_ end of numberp
    (setq x (+ (* x 10.0) (/ y 10)))
  ) ;_ end of if
) ;_ end of if
(if (/= x nil)
(setq w (cons x w))
)
)
Но остается вопрос: в последнем IF в моем коде можно как то по другому без nil? если просто писать
Код:
[Выделить все]
 (setq w (cons x w))
то в результате появляется список
Цитата:
(110.0 105.0 100.0 nil 127.0 120.0 110.0 105.0 100.0 nil 101.0 nil 105.0 101.0)
что ни есть ХОРОШО!
Ubivec81 вне форума  
 
Непрочитано 01.06.2011, 23:26
#1553
gomer

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


Цитата:
Сообщение от Ubivec81 Посмотреть сообщение
что ни есть ХОРОШО!
это очень не хорошо...
для кого #1541??????????????????????????????????????
gomer вне форума  
 
Непрочитано 02.06.2011, 07:48
#1554
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


Код:
[Выделить все]
 (defun GetPiketList (/ piket piket_list)
	  ;;(GetPiketList)
	  (while (setq piket (progn (initget 6);цикл ввода данных пользователем
	                (getreal (strcat "\nВведите пикет <"
	                         (if piket_list; Если piket_list не имеет элементов то
	                           "Завершить";Введите пикет <Завершить>:
	                           "Выход";Иначе Введите пикет <Выход>:
	                         ) ;_ end of if
	                         ">: "
	                     ) ;_ end of strcat
	                ) ;_ end of getreal
	             ) ;_ end of progn
	     ) ;_ end of setq
	    (if    (member piket piket_list); если значение элемента в списке piket_list уже есть
	      (prompt "\nПикет уже задан!");то это сообщение и пользователь вводит занова
	      (setq piket_list (cons piket piket_list));Значение пикета добавляется в список piket_list
	    ) ;_ end of if
	  ) ;_ end of while
	  (cond    (piket_list); при условии что piket_list пуст
	    ((prompt "\nНе задано ни одного пикета!"));это сообщение
	  ) ;_ end of cond
	) ;_ end of defun
вот так я это понимаю! но в случае с заплюсовкой если с nil не сравнивать то в список добавляется nil то есть пустой элемент списка.
Ubivec81 вне форума  
 
Непрочитано 02.06.2011, 08:05
#1555
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


Может, стоит ввести дополнительную проверку?
Код:
[Выделить все]
 (defun get-picket (/ picket lst)
  (while (= (type (setq picket (vl-catch-all-apply
                                 (function
                                   (lambda ()
                                     (initget 6)
                                     (getreal (strcat "\nВведите пикет <"
                                                      (if lst
                                                        "Завершить"
                                                        "Выход"
                                                        ) ;_ end of if
                                                      ">: "
                                                      ) ;_ end of strcat
                                              ) ;_ end of getreal
                                     ) ;_ end of lambda
                                   ) ;_ end of function
                                 ) ;_ end of vl-catch-all-apply
                        ) ;_ end of setq
                  ) ;_ end of type
            'real
            ) ;_ end of =
    (if (member picket lst)
      (princ "\nПикет уже задан!")
      (setq lst (cons picket lst))
      ) ;_ end of if
    ) ;_ end of while
  lst
  )
P.S. Код не проверял.
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 02.06.2011, 08:26
#1556
gomer

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Может, стоит ввести дополнительную проверку?
Да не нужна тут проверка... Опций нет, проверять нечего... Считаю свой код в #1540 наиболее адекватным...
gomer вне форума  
 
Непрочитано 02.06.2011, 08:40
#1557
Лиспер


 
Регистрация: 11.10.2010
Сообщений: 980


Даже на нажатие Esc корректно сработает?
__________________
(/= RegDate StartReadDate)
Лиспер вне форума  
 
Непрочитано 02.06.2011, 09:07
#1558
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Ubivec81 Посмотреть сообщение
Но остается вопрос: в последнем IF в моем коде можно как то по другому без nil?
Это исходный код:
Код:
[Выделить все]
  (setq x t)
(while (/= x nil) (if (numberp
      (setq x (progn (initget 4) (getreal "\nПикет<Выход>:")))
    ) ;_ end of numberp
  (if (numberp
    (setq y (progn (initget 4) (getreal "\nПлюс<Выход>:")))
      ) ;_ end of numberp
    (setq x (+ (* x 10.0) (/ y 10)))
  ) ;_ end of if
) ;_ end of if
(if (/= x nil)
(setq w (cons x w))
)
)
Тут хромает логика. Смотри что получается: проверка x на nil и формирование результирующего списка стоит вне двух проверок вводимых значений. Попробуй вводить только X, а Y не вводить - список все равно будет формироваться. Плюс к тому, пустой ввод во втором запросе к выходу из цикла не приведет. Исправляем:
Код:
[Выделить все]
 
(while (and (numberp
       (setq x (progn (initget 4) (getreal "\nПикет<Выход>:")))
     ) ;_ end of numberp
     (numberp
       (setq y (progn (initget 4) (getreal "\nПлюс<Выход>:")))
     ) ;_ end of numberp
       ) ;_ end of and
  (setq w (cons (+ (* x 10.0) (/ y 10)) w))
) ;_ end of while
Код:
[Выделить все]
 ;;;Поэтапная модернизация кода:
;;;Этап1: убираем проверки вида (/= x nil)
(setq x t)
(while x (if (numberp ;просто x вместо (/= x nil)
      (setq x (progn (initget 4) (getreal "\nПикет<Выход>:")))
    ) ;_ end of numberp
  (if (numberp
    (setq y (progn (initget 4) (getreal "\nПлюс<Выход>:")))
      ) ;_ end of numberp
    (setq x (+ (* x 10.0) (/ y 10)))
  ) ;_ end of if
) ;_ end of if
(if x ;просто x вместо (/= x nil)
(setq w (cons x w))
)
)
 
;;;Этап2: Переносим формирование списка внутрь 2-х if
(setq x t)
(while x (if (numberp
      (setq x (progn (initget 4) (getreal "\nПикет<Выход>:")))
    ) ;_ end of numberp
  (if (numberp
    (setq y (progn (initget 4) (getreal "\nПлюс<Выход>:")))
      ) ;_ end of numberp
    (progn ;;Добавляем progn, так как у нас 2 функции в одном аргументе if
    (setq x (+ (* x 10.0) (/ y 10)))
    ;;Теперь эта проверка не нужна (if x
    (setq w (cons x w))
    ;;)
    )
  ) ;_ end of if
) ;_ end of if
;;Здесь было формирование списка
  w ;Добавляем, чтобы при завершении цикла возвращался список
)
 
;;;Этап3: Убираем лишние присвоения значений
(setq x t)
(while x (if (numberp
      (setq x (progn (initget 4) (getreal "\nПикет<Выход>:")))
    ) ;_ end of numberp
  (if (numberp
    (setq y (progn (initget 4) (getreal "\nПлюс<Выход>:")))
      ) ;_ end of numberp
    ;;Вместо всего того, что ниже:
    ;;(progn
    ;;(setq x (+ (* x 10.0) (/ y 10)))
    ;;(setq w (cons x w))
    ;;Пишем такую строку:
    (setq w (cons (+ (* x 10.0) (/ y 10)) w))
    ;;)
  ) ;_ end of if
) ;_ end of if
  w
)
 
;;;Этап4: Изменяем условие while таким образом, чтобы пустой ввод второго
;;;      значения тоже приводил к завершению цикла
;;(setq x t) теперь это лишнее
(while (if (numberp ;Тут просто убираем x
      (setq x (progn (initget 4) (getreal "\nПикет<Выход>:")))
    ) ;_ end of numberp
  (if (numberp
    (setq y (progn (initget 4) (getreal "\nПлюс<Выход>:")))
      ) ;_ end of numberp
    (setq w (cons (+ (* x 10.0) (/ y 10)) w))    
  ) ;_ end of if
) ;_ end of if
  w
)
 
;;Этап5: Убираем if, т.к. если мы используем while, они не особо-то нужны
(while (and (numberp
       (setq x (progn (initget 4) (getreal "\nПикет<Выход>:")))
     ) ;_ end of numberp
     (numberp
       (setq y (progn (initget 4) (getreal "\nПлюс<Выход>:")))
     ) ;_ end of numberp
       ) ;_ end of and
  (setq w (cons (+ (* x 10.0) (/ y 10)) w))
) ;_ end of while


P.S. В этом конкретном случае, когда мы не задаем ключевых слов в initget, getreal может вернуть либо nil, либо число. Поэтому, проще проверять на nil, а проверку на число убрать. В итоге получается такая простая конструкция:
Код:
[Выделить все]
 
(while (and 
       (setq x (progn (initget 4) (getreal "\nПикет<Выход>:")))     
       (setq y (progn (initget 4) (getreal "\nПлюс<Выход>:")))     
       ) ;_ end of and
  (setq w (cons (+ (* x 10.0) (/ y 10)) w))
) ;_ end of while

Последний раз редактировалось Do$, 02.06.2011 в 09:30. Причина: P.S.
Do$ вне форума  
 
Непрочитано 02.06.2011, 18:50
#1559
gomer

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


Цитата:
Сообщение от Лиспер Посмотреть сообщение
Даже на нажатие Esc корректно сработает?
Сработает, если обработчик ошибок создать на стадии инициализации...
gomer вне форума  
 
Непрочитано 05.09.2011, 13:36
#1560
Ubivec81

проектирование железных дорог
 
Регистрация: 12.04.2010
Самара
Сообщений: 60
<phrase 1=


Доброго времени суток! Нужно рисовать вручную полилинию в цикле при чем каждый раз проходящую через разное количество точек. в дальнейшем нужна будет площадь этой полилинии, но это я уже разобрался как сделать а вот полилинию вручную в код поставить не получается!
Прошу помощи.
Ubivec81 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46