Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) - Страница 40
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 2051744
 
Непрочитано 01.03.2010, 09:17
#781
alex8888

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


Кулик Алексей aka kpblc
Цитата:
А я бы сначала сделал диалоговое окно, и потом по результатам выполнения рисовал полилинию.
А я так и сделал Поначалу проблематично было диалоговое окно делать - не мог "въехать" в синтаксис action_tile. У Полещука достаточно туманно описана эта команда, больше даны описания диалоговых окон, а вот на Афролиспе разжевано все очень подробно (еще бы так легко читалось по англицки -было бы вообще все замечательно). Если есть желание, посмотри, что у меня получилось. Это пока последняя версия, вроде бы все работает. И можешь, наверное, подсказать, какие еще функции в библиотеку перевести или наоборот взять.
Вложения
Тип файла: zip fuss.zip (12.7 Кб, 127 просмотров)
alex8888 вне форума  
 
Непрочитано 01.03.2010, 09:56
1 | #782
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,425


Сейчас пытаюсь написать статью про динамические диалоговые окна...
А так, сразу:
По поводу lsp:
  • Почему *error* не сделана локальной?
  • Нет меток начала и конца отмены (подробнее см., например, http://autolisp.ru/2009/09/20/howto_undo/ ).
  • Зачем такое количество неинформативных названий переменных? Не проще ли засунуть их в список и брать оттуда?
  • Опять же, насчет информативности: ключи в dcl я бы делал понятными. Понадобится переделывать программу через полгода - получится, что ее проще переписать заново.
  • Глобальные переменные достаточно тяжело идентифицировать.
  • action_tile я бы засовывал в отдельные локальные функции
  • Почему не используется конструкция типа (done_dialog 0) / (done_dialog 1) и т.п. с анализом возвращаемого значения?
  • Создание и настройку слоя я бы вынес в отдельную функцию. В имеющемся варианте кода однозначность работы гарантировать тяжеловато.
  • Выполнение команды (vl-cmdf "_.layer" "_s" "Schrift" "") в файле, где этого слоя нет, не гарантирует корректности работы.
  • filletrad обратно не возвращается
  • Создание текста командными методами тоже не гарантирует корректности работы (прежде всего из-за того, что пользователь может установить высоту текста в стиле равной 0. А это не отслеживается никак. Создание текста я бы тоже выносил в отдельную функцию.
  • Ну и создание полилинии - тоже в отдельную функцию.
Примерно так.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 01.03.2010, 11:19
#783
alex8888

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


Кулик Алексей aka kpblc
"Много еще не доработано, Аполлон, много, вот стану директором НУИНУ, обязательно подниму вопрос" - что то типа того из "Чародеев".
Будем копать дальше.
1.
Цитата:
Нет меток начала и конца отмены
Достаточно, если поставить
(vla-StartUndoMark (vla-Get-ActiveDocument (vlax-Get-Acad-Object)))
после команды (vl-load-com),а перед закрывающей скобкой основной функции после возврата переменных osmode и oldlay:
(vla-EndUndoMark (vla-Get-ActiveDocument (vlax-Get-Acad-Object)))?
Или нет?
2. Что значит
Цитата:
Почему *error* не сделана локальной?
?
Должен ли я при определении локальных переменных основной функции дописать туда msg и (или) *error* (хотя последнее- это команда) ? Или ты имеешь ввиду что то другое?
3.
Цитата:
Зачем такое количество неинформативных названий переменных? Не проще ли засунуть их в список и брать оттуда?
Поясни, как сделать со списком (примерно). Переменные я зашифровывал таким образом: первая буква - от имени функции, потом через подчеркивание переменная, длина, высота и тп (от немецких названий - Länge, Breite и тп). Для меня так казалось удобнее.
4.
Цитата:
Опять же, насчет информативности: ключи в dcl я бы делал понятными. Понадобится переделывать программу через полгода - получится, что ее проще переписать заново.
Тоже, что и в п.3. Насчет переделать- пока учусь еще ничего, но уже сталкивался с тем, что переписать проще заново, хотя у меня есть ключи к шифрам. Но идеи приходят, кардинальным образом требующие изменения самой программы, поэтому проще сделать снова, чем переделывать старое.
5.
Цитата:
Глобальные переменные достаточно тяжело идентифицировать.
По-моему, я их не делал Или?
6.
Цитата:
action_tile я бы засовывал в отдельные локальные функции
Покажи, пожалуйста, как. Можно ли как то универсализировать? А то каждый раз ломаю голову - какая нибудь пакость да случается.
7.
Цитата:
Почему не используется конструкция типа (done_dialog 0) / (done_dialog 1) и т.п. с анализом возвращаемого значения?
Ответ до банальности прост: не умею Если (done_dialog) еще понятен, то почему или зачем (done_dialog 0) / (done_dialog 1) - это несколько диалоговых окон, что ли?
8.
Цитата:
Создание и настройку слоя я бы вынес в отдельную функцию. В имеющемся варианте кода однозначность работы гарантировать тяжеловато.
Сам бы хотел, да ума нет. Попробую с твоей подсказкой по поводу загрузки лиспов поработать, чтобы вынести как библиотечную функцию.
9.
Цитата:
Выполнение команды (vl-cmdf "_.layer" "_s" "Schrift" "") в файле, где этого слоя нет, не гарантирует корректности работы.
Мне пока было достаточно, что текст попадает именно на этот слой и не мешает основному, а что цвет и тп не тот, я смирился. В будущем планирую посмотреть.
10.
Цитата:
filletrad обратно не возвращается
И не надо, пусть и будет такой, все равно каждый раз нужно пересматривать и подставлять новый.
11.
Цитата:
Создание текста не командными методами....
С этим прошу помочь. Просто туплю, а делать надо.
12.
Цитата:
Ну и создание полилинии - тоже в отдельную функцию.
А для конкретного случая как? Конечно, если все мои поделки будут использовать одну внешнюю, но универсальную функцию, то я готов "целовать песок" по которому пройдет тот, кто наставит меня на путь истинный
alex8888 вне форума  
 
Непрочитано 01.03.2010, 11:50
1 | #784
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,425


1. По факту у меня типовой код выглядит так:
Код:
[Выделить все]
(vl-load-com)

(defun c:cmd1 (/ *error* adoc)

  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
А наполнение потом. В том числе и *error*
2. Ошибки (скажу честно, повторяться лениво): http://autolisp.ru/2009/09/13/error-catch/
3. Я бы делал, наверно, так (правда, я и привык к англ.вариантам):
Код:
[Выделить все]
(setq var_lst '(("f_l" . 0.) ("f_n" . 0.) ...)
"Забирать" данные становится проще: (setq var (cdr (assoc "f_l" var_lst))) или (cdr(assoc "f_n" var_lst)) и т.п. И в качестве локальных переменных надо вводить одну var_lst, а не сотню (практически гарантированно рано или поздно что-то забудется). Но тут надо смотреть на целесообразность такого решения.
5. А как же rb1, rb2 и т.п.?
6. Давно не игрался с dcl, но я бы делал примерно так:
Код:
[Выделить все]
(action_tile "rb1" "(fun_action-rb1)")
И в качестве локальной функции уже сделать
Код:
[Выделить все]
(defun fun_action-rb1 ()
  (setq f_typ 0)
  (mode_tile "eb4" 0)
  (mode_tile "eb5" 1)
  (mode_tile "eb6" 0)
  (mode_tile "eb7" 1)

  (setq	w (dimx_tile "im1") ;get image tile width
	h (dimy_tile "im1") ;get image tile height
	) ;setq
  (start_image "im1") ;start the image
  (fill_image 0 0 (* 2 w) h -15)
  (slide_image 0 0 (* 2 w) h "fuss1") ;display a slide   
  (end_image)
  ) ;_ end of defun
Вносить изменения будет проще. А если еще и параметры вызова использовать, то вообще можно будет обойтись всего одной функцией.
7. Попробуй сделать так:
Код:
[Выделить все]
(action_tile "Accept" "(done_dialog 1)")
(action_tile "Cancel" "(done_dialog 0)")

(setq dlg_res (start_dialog))
(unload_dialog)

(if (= dlg_res 0) (alert "Cancelled!") (alert "Continue!"))
8. О чем задумывался я, когда создавал подобный лисп:
- в каком документе создавать (ведь можно и не текущий обрабатывать)
- если слоя нет, то его надо создавать и настраивать.
- если слой есть, то его надо настраивать.
- в слое есть свойство "типа линии". Этот тип линии может отсутствовать в документе, то есть его надо подгружать. Возможно, из нестандартных файлов *.lin. Которые, в свою очередь, могут находиться не в путях поиска. Закошмарил?
11. Либо делать через entmakex, либо через vla-addtext. Извини, сейчас полноценно показать не могу. А если все же использовать командные методы, то получится нечто типа:
Код:
[Выделить все]
(if (= (cdr (assoc 40 (entget (tblobjname "style" (getvar "textstyle"))))) 0.)
  (vl-cmdf "_.text" f_t1 "30" "" f_text)
  (vl-cmdf "_.text" f_t1 "" f_text)
  ) ;_ end of if
Расширять уже надо будет самостоятельно
12. Не сейчас. Скажу честно, времени и мозгов именно сейчас не хватает
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 02.03.2010, 01:00
#785
alex8888

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


Кулик Алексей aka kpblc
к п.12 Понятно, не хочешь, чтобы я за тобой на карачках ползал

Подскажи, пожалуйста, как сформировать полученный программой dwgru-browsefiles-in-directory список, чтобы передать его на загрузку. А то только показывается в окне, что есть по такому то пути такие то файлы и все.

Тут сообразил, что если в программе задать (load file), где файл - мой лисп, то можно оперативно подгружать недостающие функции. Типа, если команда не найдена, то загрузить функцию с этой командой, потом снова выполнить ее. Это может заметно упростить листинг основной функции, введя несколько вспомогательных библиотечных.
alex8888 вне форума  
 
Непрочитано 29.04.2010, 08:27
#786
magiker


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


Подскажите пожалуйста =) Есть функция
Код:
[Выделить все]
(defun Beta (a b g h)
  (
   (setq ChTg2b	(* 2 (+ (* a h) (* b g)))
	 ZnTg2b	(- (- (expt a 2) (expt h 2)) (- (expt b 2) (expt g 2)))
	 tg2b	(/ ChTg2b ZnTg2b))
   (/ (atan tg2b) 2)
  )
)
На ней выдается ошибка unknown format directive: "["
В каком месте эта ошибка-то? Заранее спасибо
magiker вне форума  
 
Непрочитано 29.04.2010, 09:23
#787
Do$

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


Выделил скобки, которые тут лишние:
Код:
[Выделить все]
(defun Beta (a b g h)
  (
   (setq ChTg2b	(* 2 (+ (* a h) (* b g)))
	 ZnTg2b	(- (- (expt a 2) (expt h 2)) (- (expt b 2) (expt g 2)))
	 tg2b	(/ ChTg2b ZnTg2b))
   (/ (atan tg2b) 2)
  ))
Do$ вне форума  
 
Непрочитано 29.04.2010, 09:32
#788
magiker


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


странно... спасибо, никак не привыкну к лиспу с его скобками, путаюсь

а не, все-равно выдает ошибку эту же... причем выдает ее, если не ошибаюсь, на
Код:
[Выделить все]
(setq ChTg2b	(* 2 (+ (* a h) (* b g)))
	 ZnTg2b	(- (- (expt a 2) (expt h 2)) (- (expt b 2) (expt g 2)))
	 tg2b	(/ ChTg2b ZnTg2b))
magiker вне форума  
 
Непрочитано 29.04.2010, 09:38
#789
Do$

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


Тут как раз в коде все хорошо.
Проверял так:
Код:
[Выделить все]
(setq a    1
      b    2
      h    3
      g    4
) ;_ end of setq
(setq ChTg2b (* 2 (+ (* a h) (* b g)))
      ZnTg2b (- (- (expt a 2) (expt h 2)) (- (expt b 2) (expt g 2)))
      tg2b   (/ ChTg2b ZnTg2b)
) ;_ end of setq
Вообще, никогда не выскакивала такая ошибка:
Код:
[Выделить все]
unknown format directive: "["
Do$ вне форума  
 
Непрочитано 29.04.2010, 09:39
#790
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,425


Русификатор не ставил?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.04.2010, 09:48
#791
magiker


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


Ну он в комплекте шел, точнее сразу русифицированный ставился

А может я велосипед изобретаю? В целом задача тривиальная: есть функция (астроида), заданная параметрическим уравнением
Код:
[Выделить все]
x=Fx(t)
y=Fy(t)
Надо построить график этой функции и график функции с применением матрицы преобразований (a b g h)
На любом другом языке сделал бы уже давно, а на лиспе всю ночь мучаюсь, и пока ничего. Может дадите волшебного пинка в нужном направлении?

А, и самое главное - АвтоКАД 2005

Последний раз редактировалось magiker, 29.04.2010 в 10:05.
magiker вне форума  
 
Непрочитано 29.04.2010, 10:06
#792
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,425


Эта ошибка была в версиях 2005 и, по-моему, в 2006. Попробуй SP поставить - вроде бы решалась проблема, но точно не помню
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 29.04.2010, 10:12
#793
magiker


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


А где взять сервиспак на варезный кад? )

Все, вопрос снят. Нашел, качаю. Посмотрим, встанет ли он на левый серийник

Еще такой вопрос по структуре программы на лиспе. Функция должна быть описана до ее первого вызова или не имеет значения? И как все-таки быть со скобками в функции, возвращающей значение? Учебник говорит что синтаксис такой
(defun %FnName% (par1 par2 ...) (%FnBody%) ), и как пример - стандартный DtR
(defun dtr (u)
(* pi (/ u 180)) ;Это как я понимаю то значение которое функция должна вернуть
)

А как быть если перед расчетом возвращаемого значения надо провести дополнительные расчеты?

Последний раз редактировалось magiker, 29.04.2010 в 11:26.
magiker вне форума  
 
Непрочитано 29.04.2010, 11:59
#794
Do$

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


Цитата:
Сообщение от magiker Посмотреть сообщение
Функция должна быть описана до ее первого вызова или не имеет значения?
Обязательно до! На момент первого обращения к ней, она должна быть уже загружена.
Цитата:
Сообщение от magiker Посмотреть сообщение
А как быть если перед расчетом возвращаемого значения надо провести дополнительные расчеты?
Код:
[Выделить все]
(defun test (a b / c)
  (setq c (list a b))
  ;; <дополнительные рассчеты>
  c
) ;_ end of defun
Do$ вне форума  
 
Непрочитано 29.04.2010, 12:05
#795
magiker


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


а что в строке (a b / c) означает слэш?
magiker вне форума  
 
Непрочитано 29.04.2010, 12:09
#796
Do$

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


Разделяет список переменных на глобальные и локальные.
В данном случае, после выполнения функции test локальной переменной C будет присвоено то значение, которое у нее было до начала выполнения функции.
Do$ вне форума  
 
Непрочитано 29.04.2010, 12:13
#797
magiker


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


ага понятно. А как явно указать значение которое должно быть присвоено функции в итоге?
magiker вне форума  
 
Непрочитано 29.04.2010, 12:27
#798
Do$

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


Цитата:
Сообщение от magiker Посмотреть сообщение
А как явно указать значение которое должно быть присвоено функции в итоге?

Наверное, это следует понимать так:
Как задать значение, которое вернет функция после ее вызова?
Я ж показал, для при веденного выше примера - функция test:
-обращаемся к функции:
(test 1 2) но надо как-то сохранить результат работы функции, поэтому:
- сохраняем возвращаемое значение:
(setq test_rez (test 1 2))
А функция test будет всегда возвращать вычисленное значение своей локальной переменной C, потому что в коде после всех вычислений стоит C:
Код:
[Выделить все]
(defun test (a b / c)
  (setq c (list a b))
  ;; <дополнительные рассчеты>
  c
) ;_ end of defun
Do$ вне форума  
 
Непрочитано 29.04.2010, 12:30
#799
magiker


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


Во =) Спасибо за доходчивое объяснение

З.ы. сорри за невнятные вопросы, вторые сутки не сплю, поэтому мозг немного притормаживает

Установка СП1 на АвтоКАД 2005 убила серийник, что впрочем и ожидалось. Поставил 2010 Кад, но тут другая проблема... а где в нем автолисп? о.0

Нашел, невнимательно смотрел просто. Очередной вопрос возник. Как в команде
(command "_.line" p1 p2)
задать ширину (толщину) линии и ее цвет?

Разобрался... Следующий вопрос
Код:
[Выделить все]
;Fx = R * cos^3(t)
(defun Fx (tt r / c)
  (setq c (* r (expt (cos tt) 3)))
  c
)

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

(defun dl (p1 p2)
  (command "_.line" p1 p2 "")
)

(defun c:dc ()
  (setq R 2.0 
          Ts 0.0
          Te (* pi 2)
          St (* pi 0.01)
          Mn 10)
  (setq Sch Ts)
  (while (<= Sch Te)
    (setq x1  (* Mn (fx Sch R))
            y1  (* Mn (fy Sch R))
            p1  (list x1 y1)
            x2  (* Mn (fx (+ sch St) R))
            y2  (* Mn (fy (+ sch St) R))
            p2  (list x2 y2))
    (dl p1 p2)
    (setq sch (+ sch St))
  )
)
Результатом должен быть график астроиды, но получается вот что:


Т.е. в целом рисунок правильный, не считая углов. Не подскажите почему?

Поэкспериментировал сейчас - оказывается если максимально приблизить рабочий лист перед выполнением программы то строится без проблем, точнее чем больше приближение тем меньше скос на углах. Как избавиться от этого? Надо чтоб рисовалось нормально, независимо от масштаба

Решил немного изменить алгоритм. Пусть сначала все точки собираются в список, а потом из этих точек рисовать график. Т.е. в теории это выглядит так
Код:
[Выделить все]
(while (<= Sch Te)
  (setq x  (* Mn (fx Sch))
          y  (* Mn (fy Sch))
          p  '(x y))
  (setq Pts (list Pts p))
  (setq sch (+ sch St))
)
На практике же не совсем уверен в строке (setq Pts (list Pts p))
Результатом работы циклы должен стать список ((х1 у1) (х2 у2) (х3 у3) (х4 у4) ... )
Но если использовать list то скорее всего получится ((((((х1 у1) (х2 у2)) (х3 у3)) (х4 у4)) ... ) как-то так
Вобщем, как правильно в цикле составить список точек, и главное - как из этого списка построить полилинию?

Ну помогите кто-нибудь пожалуйста

Со скошенными углами разобрался, концы отрезков прилепляются к ближайшей точке. Справился отключением данного параметра.
Вопрос с формированием массива точек и рисованием линии из этого массива все еще актуален

Последний раз редактировалось magiker, 30.04.2010 в 03:27. Причина: Включил мозг
magiker вне форума  
 
Непрочитано 30.04.2010, 08:23
#800
Makswell

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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Цитата:
Сообщение от magiker
Функция должна быть описана до ее первого вызова или не имеет значения?
Обязательно до! На момент первого обращения к ней, она должна быть уже загружена.
Цитата:
Сообщение от Do$ Посмотреть сообщение
Разделяет список переменных на глобальные и локальные.
Немного позанудствую.
Вот код:
Код:
[Выделить все]
(defun test1 ()
  (princ (test 2 3))
  (setq d 5)
  (princ)
)
(defun test (a b / c)
  (setq c (list a b))
  c
)
Вот проверка:
Цитата:
; 2 форм загружено из #<editor "<Без имени-0> загружается...">
_$ (test1)
(2 3)
_$ a
nil
_$ c
nil
_$ d
5
Или вот код:
Код:
[Выделить все]
(defun test1 ()
  (princ (test 2 3))
  (defun test (a b / c)
    (setq c (list a b))
    c
  )
  (setq d 5)
  (princ)
)
Проверка:
Цитата:
; 1 блок кода загружено из #<editor "<Без имени-0> загружается...">
_$ (test1)
(2 3)
_$ a
nil
_$ d
5
В результате можно сделать выводы:
1. Функцию можно определять и после её первого вызова.
2. Слэш не разделяет список переменных на глобальные и локальные. Он отделяет аргументы функции от её локальных переменных. Глобальные переменные появляются, если они просто не прописаны явно как локальные. А аргументы тоже по-сути локальны, что доказыавает проверка: a=nil.
Makswell вне форума  
Ответ
Вернуться   Форум 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