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

Вернуться   Форум 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.
Просмотров: 1965882
 
Непрочитано 30.04.2010, 09:01
#801
Do$

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


Цитата:
Сообщение от Makswell Посмотреть сообщение
1. Функцию можно определять и после её первого вызова.
В показанном варианте вызова функции как такового не происходит. Это просто объявления двух функций, одна из которых используется внутри другой. Фактически, первый вызов был тут:
Код:
А к этому времени функция test уже была объявлена. А такие замечания способны запутать начинающего! Естествено - это мое мнение, не утверждаю, что единственно верное
Цитата:
Сообщение от Makswell Посмотреть сообщение
2. Слэш не разделяет список переменных на глобальные и локальные. Он отделяет аргументы функции от её локальных переменных. Глобальные переменные появляются, если они просто не прописаны явно как локальные. А аргументы тоже по-сути локальны, что доказыавает проверка: a=nil.
Да, так, конечно, правильно!
magiker, как я понял, у тебя сложность с формированием списка. Для этого есть две полезные функции: cons и append. Cons - добавление в список элемента на первое место, append - слияние списков в один.
Примеры:
Код:
[Выделить все]
(setq Pts (cons p Pts))
(setq Pts (append Pts (list p)))
cons использовать предпочтительнее, но надо учесть такие особенности:
- если второй аргумент не является списком или nil (nil по сути есть пустой список), то создастся точечная пара. Примеры:
Код:
[Выделить все]
(cons 1 (list 1 2 3))
;-->(1 1 2 3)
(cons 1 nil)
;-->(1)
(cons 1 1)
;-->(1 . 1)
(cons (list 1 2 3) 1)
;-->((1 2 3) . 1)
- когда формируешь список в цикле используя cons, в результате получается список вида: (...<третье добавление> <второе добавление> <первое добавление>), поэтому часто требуется после формирования список "развернуть". Для этого есть специальная функция reverse.
Код:
[Выделить все]
(setq i 0 rez nil)
(while (< i 10)
  (setq rez (cons i rez)
	i (1+ i)
	)
) ;_ end of while
rez
;-->
(9 8 7 6 5 4 3 2 1 0) 


(setq rez (reverse rez))
;-->(0 1 2 3 4 5 6 7 8 9)
Do$ вне форума  
 
Непрочитано 30.04.2010, 09:25
#802
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Цитата:
Сообщение от Do$ Посмотреть сообщение
В показанном варианте вызова функции как такового не происходит. Это просто объявления двух функций, одна из которых используется внутри другой
Для этого я как раз написал второй пример. Повторю.
Код:
[Выделить все]
(defun test1 ()
  (princ (test 2 3))
  (defun test (a b / c)
    (setq c (list a b))
    c
  )
  (setq d 5)
  (princ)
)
Здесь функция test вызывается до того, как она была определена (defun test...
Дело в том, что сначала код загружается в память. Оперативную. Опеределённые программистом функции вносятся в список лисп-символов (на равне например со стандартными символами setq или тот же defun и т.п.), а потом уже происходит выполнение этого кода. Как-то так я всё это себе представляю.
Хотя может быть мы вообще о разных вещах говорим.

Добавлено:
Вот кстати для наглядности. В смыле, что имел ввиду, говоря, что функция вносится в список лисп-символов.
Цитата:
_$ setq
#<SUBR @113e29ec SETQ>
_$ test
#<USUBR @133054ec TEST>

Последний раз редактировалось Makswell, 30.04.2010 в 09:36.
Makswell вне форума  
 
Непрочитано 30.04.2010, 09:33
#803
Do$

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


А вот в таком варианте уж точно не будет работать.
Код:
[Выделить все]
TEST1 
_$ (test1)
; error: no function definition: TEST
_1$
Do$ вне форума  
 
Непрочитано 30.04.2010, 09:45
#804
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,204


Хы, точно, херню я написал. Видимо эта test уже висела в памяти, опредёлённая раньше. При презагрузке Автокада так и вышло. Как у тебя. В таком случае, ты безусловно прав. Однозначно.
Ладно, проехали.
Makswell вне форума  
 
Непрочитано 30.04.2010, 14:14
#805
magiker


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


Do$, Makswell, спасибо за советы. Со списками разобрался более-менее. Теперь у меня есть список вида ( (х1.у1) (х2.у2) (х3.у3) ... ) А как из точек, описанных в этом списке, построить линию? И не совсем понятно, что лучше использовать - _.line или _.pline
magiker вне форума  
 
Непрочитано 30.04.2010, 14:35
#806
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от magiker Посмотреть сообщение
А как из точек, описанных в этом списке, построить линию?
Код:
[Выделить все]
(setq lst '((10.5 10)(11.3 12)(9 4.5)(2.2 3.3)(18.5 12.3))) ;_Список
(command "_.PLINE")
(foreach pt lst (command "_none" pt))
(command "")
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.04.2010, 14:37
#807
magiker


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


о как... спасибо

Добавлено:
Ан нет. Пишет "unknown command NONE"
Что не так?

Последний раз редактировалось magiker, 30.04.2010 в 14:45.
magiker вне форума  
 
Непрочитано 30.04.2010, 16:00
#808
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от magiker Посмотреть сообщение
Ан нет. Пишет "unknown command NONE"
"_none" это опция привязкию По русски "Ничего". Попробуй вместо "_none" "_non". Геоникс случайно не установлен?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 30.04.2010, 18:23
#809
magiker


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


VVA, нет, чистый АвтоКАД 2010, английский, без русификатора, без доп. пакетов

Код:
[Выделить все]
(defun Fx (tt / c)
  (setq c (* r (expt (cos tt) 3)))
  c
)

(defun Fy (tt / c)
  (setq c (* r (expt (sin tt) 3)))
  c
)

(defun c:dc ()
  (setvar "CMDECHO" 0)
  (setvar "OSMODE" 0)
  (setq R 1.0
          Ts 0.0
          Te (* pi 2)
          St (* pi 0.01))
          Pts ())
  
  (setq Sch Ts)
  (while (<= Sch Te)
    (setq x  (fx Sch)
          y  (fy Sch)
          p  (cons x y)
          Pts (cons Pts p)
      sch (+ sch St))
  )

  (command "_.pline")
  (foreach pt pts (command "_none" pt))
  (command "")
  
  (command "_zoom" "_e")
)
Пробовал _none, _non, _no... больше фантазии нехватает
magiker вне форума  
 
Непрочитано 01.05.2010, 01:24
#810
superkot007


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


Нашел lisp...
Код:
[Выделить все]
;;----------------------------------------------------
;;  Программа для выравнивания отрезков по осям X и Y
;;  Если отрезки не будут лежать в плоскости МСК
;;  результат работы не определен.
;;  Автор Александр Ривилис.
;;----------------------------------------------------
(defun C:L_ALIGN_XY ( / ss en e p1 p2 i n dir d dr x y l dl)
    (setvar "CMDECHO" 0)
    (if (null L_ALIGN_XY_delta_ang) (progn
       (setq L_ALIGN_XY_delta_ang 1.0)
    )) ;; (if (progn
    (setq d (getreal
      (strcat "\nМаксимальный угол отклонения от оси в градусах <"
              (rtos L_ALIGN_XY_delta_ang 2 3) ">: ")))
    (if d (setq L_ALIGN_XY_delta_ang (abs d)))
    (setq d (* PI (/ L_ALIGN_XY_delta_ang 180.0)))
    (princ "\nВыберите отрезки для выравнивания: ")
    (cond
      ((setq ss (ssget '((0 . "LINE"))))
        (setq i 0 n (sslength ss))
        (while (< i n)
          (setq e (entget (ssname ss i)))
          (setq p1 (cdr (assoc 10 e)) p2 (cdr (assoc 11 e)))
          (setq l (distance p1 p2)) ;; Длина отрезка
          (setq dir (angle p1 p2)) ;; Находим угол с осью X
          ;; Приводим угол в диапазон 0...2*PI
          (if (< dir 0.0) (setq dir (+ (* 2.0 PI) dir)))
          (cond
            ;; Отрезок условно параллелен оси X
            ((or (equal dir 0.0 d) (equal dir PI d) (equal dir (* 2.0 PI) d))
              (setq y (* 0.5 (+ (cadr p1) (cadr p2))))
              (setq p1 (list (car p1) y (caddr p1)))
              (setq p2 (list (car p2) y (caddr p2)))
              (setq dl (* 0.5 (- l (distance p1 p2))))
              ;; Восстанавливаем длину отрезка
              (setq p1 (polar p1 (angle p2 p1) dl))
              (setq p2 (polar p2 (angle p1 p2) dl))
              (setq e (subst (cons 10 p1) (assoc 10 e) e))
              (setq e (subst (cons 11 p2) (assoc 11 e) e))
              (entmod e)
            )
            ;; Отрезок условно параллелен оси Y
            ((or (equal dir (* PI 0.5) d) (equal dir (* PI 1.5) d))
              (setq x (* 0.5 (+ (car p1) (car p2))))
              (setq p1 (list x (cadr p1) (caddr p1)))
              (setq p2 (list x (cadr p2) (caddr p2)))
              (setq dl (* 0.5 (- l (distance p1 p2))))
              ;; Восстанавливаем длину отрезка
              (setq p1 (polar p1 (angle p2 p1) dl))
              (setq p2 (polar p2 (angle p1 p2) dl))
              (setq e (subst (cons 10 p1) (assoc 10 e) e))
              (setq e (subst (cons 11 p2) (assoc 11 e) e))
              (entmod e)
            )
          ) ;; (cond
          (setq i (1+ i))
        ) ;; endof (while
      )
      (T
       (princ "\nНичего не выбрано, или выбрано что-то не то!")
      )
    ) ;; (cond
    (princ)
)
но почему-то "не пашет" (проверял и в 2006, и в 2011). И еще - как его модернизировать, чтобы он еще и выравнивал концы отрезков по координатам, кратным, например, 5...

Т.е. если, например, отрезок имеет начало в т. (548;762) и конец в (987;759), то сначала выравнивание по горизонтали, а затем - по точкам (550;760) - (985;760). Зачастую попадаются чертежи, выполненные без привязки или нарушенной ортогональностью
superkot007 вне форума  
 
Непрочитано 01.05.2010, 15:57
#811
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


magiker, Убери "_none" совсем. А еще лучше покажи листинг того, что делаешь
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 02.05.2010, 03:08
#812
magiker


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


VVA, опишу тогда все с самого начала для большего понимания. Дана функция, заданная параметрически, т.е.
x = Fx(t)
y = Fy(t)
Надо построить график этой функции

На текущий момент код имеет такой вид
Код:
[Выделить все]
;                 2*(a*h + b*g)    
; tg(2Beta) = ---------------------
;             ((a^2-h^2)-(b^2-g^2))
(defun Beta (/ c)
  (setq ChTg2b    (* 2 (+ (* a h) (* b g)))
        ZnTg2b    (- (- (expt a 2) (expt h 2)) (- (expt b 2) (expt g 2)))
        tg2b    (/ ChTg2b ZnTg2b))
  (setq c (/ (atan tg2b) 2))
  c
)

;             a*sin(Beta) - h*cos(Beta)
; tg(Alpha) = -------------------------
;             b*cos(Beta) - g*sin(Beta)
(defun Alpha (/ c)
  (setq ChTgA (- (* a (sin (Beta))) (* h (cos (Beta))))
        ZnTgA (- (* b (cos (Beta))) (* g (sin (Beta))))
        TgA   (/ ChTgA ZnTgA))
  (setq c (atan TgA))
  c
)

;      a*cos(Beta)+h*sin(Beta)   b*sin(Beta)+g*cos(Beta)
; k1 = ----------------------- = -----------------------
;            cos(Alpha)                sin(Alpha)       
(defun k1 (/ c)
  (if (= (cos (Alpha)) 0)
  ; then
    (setq Ch (+ (* b (sin (Beta))) (* g (cos (Beta))))
          Zn (sin (Alpha)))
  ; else
    (setq Ch (+ (* a (cos (Beta))) (* h (sin (Beta))))
          Zn (cos (Alpha)))
  ); end if
  (setq c (/ Ch Zn))
  c
)

;      a*sin(Beta)-h*cos(Beta)   b*cos(Beta)-g*sin(Beta)
; k2 = ----------------------- = -----------------------
;            sin(Alpha)                cos(Alpha)
(defun k2 (/ c)
  (if (= (sin (Alpha)) 0)
  ; then
    (setq Ch (- (* b (cos (Beta))) (* g (sin (Beta))))
          Zn (cos (Alpha)))
  ; else
    (setq Ch (- (* a (sin (Beta))) (* h (cos (Beta))))
          Zn (sin (Alpha)))
  ); end if
  (setq c (/ Ch Zn))
  c
)

; Fx = R * cos^3(t)
(defun Fx (tt / c)
  (setq c (* r (expt (cos tt) 3)))
  c
)

; Fy = R * sin^3(t)
(defun Fy (tt / c)
  (setq c (* r (expt (sin tt) 3)))
  c
)

; FxP = k1*Fx*cos(Alpha) - k2*Fy*sin(Alpha)
(defun FxP (tt / c)
  (setq c (- (* (k1) (fx tt) (cos (alpha))) (* (k2) (fy tt) (sin (alpha)))))
  c
)

; FyP = k1*Fx*sin(Alpha) + k2*Fy*cos(Alpha)
(defun FyP (tt / c)
  (setq c (+ (* (k1) (fx tt) (sin (alpha))) (* (k2) (fy tt) (cos (alpha)))))
  c
)


(defun dl (pt1 pt2)
  (command "_.line" pt1 pt2 "")
)

(defun c:dc ()
  (setvar "CMDECHO" 0)
  (setvar "OSMODE" 0)
  (setq a 1
        b 1
        g 0
        h 1
    R 1.0
        Ts 0.0
        Te (* pi 2)
    St (* pi 0.01)
        Pts ())

  (setq Sch Ts)
  (while (<= Sch Te)
    (setq x1  (fxp Sch)
          y1  (fyp Sch)
          p1  (list x1 y1)
          x2  (fxp (+ sch St))
          y2  (fyp (+ sch St))
          p2  (list x2 y2)
      sch (+ sch St))
    (dl p1 p2)
  )

  (command "_zoom" "_e")
)
Хотелось бы переделать функцию dc() так, чтоб график рисовался сразу весь, а не отдельными отрезками. Ну и если укажите на явные косяки (а точнее не оптимальные пути решения) в коде - тоже буду премного благодарен

Ну и совсем уж идеальный вариант - добавить функцию для рисования осей координат с делениями. И чтоб оси были одного цвета, а график чуть толще и другого цвета

З.Ы. АвтоЛИСП, равно как и АвтоКАД, вижу впервые в своей жизни, так что за кривой код строго не судите
magiker вне форума  
 
Непрочитано 02.05.2010, 13:07
#813
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


magiker, Вроде как так
Код:
[Выделить все]
(defun c:dc ( )
  (setvar "CMDECHO" 0)
  (setvar "OSMODE" 0)
  (setq a 1
        b 1
        g 0
        h 1
    R 1.0
        Ts 0.0
        Te (* pi 2)
    St (* pi 0.01)
        Pts ())

  (setq Sch Ts)
  (setq x1  (fxp Sch)
        y1  (fyp Sch)
        p1  (list x1 y1)
	)
  (setvar "CELWEIGHT" 50) ;_ Вес
  (setvar "CECOLOR" "1")    ;_ Цвет
  (command "_.PLINE" p1)
  (while (<= Sch Te)
    (setq x2  (fxp (+ sch St))
          y2  (fyp (+ sch St))
          p2  (list x2 y2)
      sch (+ sch St))
    (command p2)
    ;;;(dl p1 p2)
  )
(while (> (getvar "CMDACTIVE") 0)(command ""))
(command "_zoom" "_e")
)
Остальные ф-ции в #812
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 02.05.2010 в 13:13.
VVA вне форума  
 
Непрочитано 02.05.2010, 15:09
#814
magiker


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


Спасибо, все работает. Только немного непонятно с толщиной (весом) линии. Пробовал разные значения - разницы так и не увидел. В чем подвох? )
И еще такой вопрос - как удалить все что нарисовано, очистить лист?

С удалением разобрался, а вот с толщиной линии все еще не понятно. Разницы не вижу хоть убей

Последний раз редактировалось magiker, 02.05.2010 в 20:40.
magiker вне форума  
 
Непрочитано 03.05.2010, 09:57
#815
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от magiker Посмотреть сообщение
С удалением разобрался, а вот с толщиной линии все еще не понятно. Разницы не вижу хоть убей
Разницу увидишь когда напечатаешь лист. Еще в Автокаде внизу под командной строкой есть кнопки. Одна из них отвечает за показ весов линий. Альтернативный вариант - набрать команду _lweight и включить чек-бокс "Отображать линии в соответствии с весами".
Цитата:
И еще такой вопрос - как удалить все что нарисовано, очистить лист?
Код:
[Выделить все]
(command "_.erase" "_all" "")
Кстати в коде я показал явное присвоение цвета и веса. Правильнее все разнести по слоям
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 03.05.2010 в 18:04. Причина: Орфография
VVA вне форума  
 
Непрочитано 03.05.2010, 17:35
#816
magiker


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


VVA, спасибо, все получилось. Разносить по слоям смысла нет, работа дипломная, важен сам факт построения графиков - все остальное это уже личная инициатива =)

Еще раз спасибо всем кто откликнулся
magiker вне форума  
 
Непрочитано 04.05.2010, 18:24
#817
kha

BIM, С#, AutoCAD, LISP
 
Регистрация: 15.03.2006
Дуброво
Сообщений: 657


Добрый день!

Пополняю ряды чайников!

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

http://forum.dwg.ru/showpost.php?p=179141&postcount=1

пока что заткнулся на вот этой строке (выделено красным):

Код:
[Выделить все]
(if
(and
(setq ss (ssget "_X" '((0 . "INSERT")(66 . 1))))
(setq lst (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp(mapcar 'cadr(ssnamex ss)))))
я так понял, что здесь список объектов чертежа превращается в удобоваримый список для обработки vla- функциями.

1. ssnamex - извлекает примитив из набора по порядковому номеру
2. cadr - извлекает второй элемент из списка, который даёт (ssnamex ss)
3. mapcar - повторяет п. 2 с каждым элементом набора ss
4. listp - проверяет, является ли списком то, что получилось в результате п.3.

заткнулся на функции vl-remove-if - не понял как работает. То есть через командную строку прогнал, посмотрел что на выходе даёт, но не понял как.

в "Visual Lisp и секреты адаптации AutoCAD" (издание 2001 г.) читаю:

"Удаляет из списка все элементы, возвращающие Т при проверке тест-функцией"

тест-функция - здесь listp

по этому описанию выходит, что эта функция удаляет из списка как раз те элементы, которые нам нужны, чего на практике не происходит.
__________________
"Молодой человек, Вы не представляете всей широты поставленной перед Вами задачи." © Панкратова Г.Е.

Последний раз редактировалось kha, 04.05.2010 в 18:34.
kha вне форума  
 
Непрочитано 04.05.2010, 19:15
1 | #818
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от kha Посмотреть сообщение
1. ssnamex - извлекает примитив из набора по порядковому номеру
Неверно. Найди разницу между функциями ssnameX и ssname
Цитата:
2. cadr - извлекает второй элемент из списка, который даёт (ssnamex ss)
Правильно
Цитата:
3. mapcar - повторяет п. 2 с каждым элементом набора ss
Неверно. С каждым элементом списка, возвращенного (ssnameX ss)
Цитата:

4. listp - проверяет, является ли списком то, что получилось в результате п.3
Верно.
Функция vl-remove-if применяет тестовую ф-цию listp к каждому элементу списка, возвращенноно ф-цией п.2 и удаляет из списка те элементы, у которых listp вернула истину. Т.е. те элементы, которые являются списками, в том числе и nil - пустой список.

Код:
[Выделить все]
(setq lst (mapcar
            'vlax-ename->vla-object
                (vl-remove-if    ;_Шаг  4. -> (<Имя объекта: 7ef835f0> <Имя объекта: 7ef834d8>) 
                  'listp         
                  (mapcar
                    'cadr        ;_Шаг  3. -> (<Имя объекта: 7ef835f0> <Имя объекта: 7ef834d8>) 
                    (ssnamex     ;_Шаг  2. -> ((0 <Имя объекта: 7ef835f0> 0) (0 <Имя объекта: 7ef834d8> 0)) 
                       (setq ss (ssget "_X" '((0 . "INSERT")(66 . 1)))) ;_Шаг 1.->  <Selection set: 7> 
                      ) 
                    )
                  )
          ) ;_ end of mapcar
) ;_ end of setq
Если бы на шаге 3 список имел вид (<Имя объекта: 7ef835f0> <Имя объекта: 7ef834d8> nil (1 2 3))
то, на шаге 4 он принял бы вид (<Имя объекта: 7ef835f0> <Имя объекта: 7ef834d8>) Два последних элемента списка vl-remove-if удалит, так как если к ним применить listp, то она вернет истину.
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 05.05.2010 в 09:18.
VVA вне форума  
 
Непрочитано 04.05.2010, 19:37
#819
kha

BIM, С#, AutoCAD, LISP
 
Регистрация: 15.03.2006
Дуброво
Сообщений: 657


VVA: спасибо за разъяснения, всё понял!

Буду копать дальше, потом выложу этот лисп с подробными пошаговыми комментариями. Ну и если возникнут вопросы по ходу изучения - буду писать сюда
__________________
"Молодой человек, Вы не представляете всей широты поставленной перед Вами задачи." © Панкратова Г.Е.
kha вне форума  
 
Непрочитано 04.05.2010, 21:17
#820
magiker


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


И снова драсти =)

Вопрос: есть список с числами. Как из него выбрать максимальное и минимальное число?
magiker вне форума  
Ответ
Вернуться   Форум 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