Хочу изучить лисп.
Понимание что такое программирование есть, правда давно забыто и не используется, поэтому нужно совсем-совсем с нуля, что читать, как читать и где.
Есть ли смысл изучать LISP или можно сразу на AutoLISP переключаться?
P.S. Думаю эта тема не только мне будет интересна, поэтому поддерживающие, welcome к обсуждению
Может, лучше поставить какую-нибудь не очень сложную и большую задачу, а в ответ - код с построчным комментированием? 🙂
Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.
Алексей Кулик aka kpblc | Aleksei Kulik aka kpblc Facebook | LinkedIn
autolisp.ru
Техническая поддержка программистов Autodesk в СНГ
Библиотека пользовательских lisp-функций | Custom Lisp-function library
Привет, Лена! 🙂
Всегда готов помочь!
по поводу задач, для начала стоит взять простые - функционал - односложная операция в акаде.
К вопросу о языке, конечно сразу AutoLISP. С таким учителем как Алексей, тебе нечего бояться...
Наибольший прирост производительности добавляется простыми функциями, которые через имеющийся функционал быстро выполняются, но можно еще упростить и главное, такие функции должны очень много раз повторятся.
Например, тебе нужно регулярно рисовать круги и только одного из трех радиусов. Тогда имеет смысл добавить три кнопки для каждого круга по отдельности и рисовать круги только указывая центр.
Придумай задачку, не важно какая сложность. Мы поможем ее поделить на простые и начнем с малого...
Хорошего дня.
Женя, спасибо за поддержку!
Я таки взялась за это дело.
Задача на сегодняшний день следующая: замена путей файлов (см. рис)
Лисп-файл я буду подкреплять к корпоративному файлу адаптации, т.е. при запуске AutoCAD у пользователя он будет исполняться, мне необходимо изменить остальные пути из списка. Не все, но большая часть.
Леша kpblc уже писал мне для папки support, но мне сложно читать код, я не знаю основных принципов и синтаксиса. Собственно, с этого и хочу начать: что за скобки, зачем, куда вставляются.
Леша, спасибо за ответ!
Комментарии - это очень здорово, но как я уже ответила Жене, мне сложно читать код в принципе. Воспринимайте меня как студента первого курса...я ничего не знаю, дайте ссылку, где почитать 🙂
Я начала читать вики-учебник вот тут: http://ru.wikibooks.org/wiki/%D0%9B%D0%B8%D1%81%D0%BF
А также пробую пройти курс на интиуите, но с первой лекции по скриншотам похоже, что написано на версию 2002-2004-2006...
да уж, посмотрел в нете, похоже стоит самому писать статью, как начать писать на лиспе...
Начинать сразу с автолиспа. Понимание программирования не обязательно - придет в процессе гарантировано:-). Нужно неплохо знать автокад. Далее пример текста занятия. Усвоение материала проверено на практике. Текст составлен мною на основе очных практических занятий. Программирование осваивал самостоятельно (с 1991 года примерно), образование инженер-дорожник.
С уважением, Скляров И.Б.
Занятие 1
в котором мы будем учиться приказывать и выражаться
Тема: Программа. Функция. Выражение. Данные. Переменные.
Компьютерная программа – это последовательность команд для компьютера. Назначение программы - что-то рассчитать (или начертить, или и то, и другое). Условно, программу можно разделить на три части:
Т.е. в начале программы идут команды, которые обеспечивают ввод (или сбор) исходных данных, затем идет часть команд, которые эти данные обсчитывают, и последние из этой последовательности команд производят вывод результата. Иными словами, показывают человеку, что получилось.
Эти три части могут в одной программе повторяться или идти вперемешку. Но такую программу можно “поделить” на подпрограммы в соответствии означенному принципу.
Итак, программа – это последовательность команд, или, иными словами, “приказов” (в нашем случае, автокаду) сделать что-то. Поскольку компьютер абсолютный педант, то и приказы ему нужно отдавать четко, ясно и однозначно.
“Четко” – это значит правильно, без опечаток, писать имена команд (функций) и вообще все слова и цифры, что вы пишете в программе, “ясно” означает, что ставить слова в приказе нужно в определенном порядке, “однозначность” обязывает применять слова, подходящие по смыслу.
Такой вот приказ в автолиспе называется выражением. Но прежде чем прикоснуться к таинству записи выражений, лучше познакомиться с такой штуковиной, как функции автолиспа. Кратко: в автокаде есть команды, в автолиспе есть функции. Разница: команды автокада запрашивают данные у пользователя, функциям требуются в процессе написания программы. Т.е., описывая функцию, программист уже должен знать ответы на ее вопросы! Эти ответы называются аргументами функции, а, попросту говоря, это данные, которые она, функция, обработает.
Хочется добавить особо, что в автолиспе термин “функция” следует трактовать как нечто функционирующее, выполняющее что-то, т.е. некое действие. Меня, к примеру, в начале знакомства с этим языком и одновременно с программированием несколько сбили с толку школьные воспоминания о функциях и графиках. Здесь же, повторюсь, функция – это приказ компьютеру в лице автокада что-то сделать.
Чтобы выпутаться из этих формулировок, вот пример.
Вспомним работу команд в акаде. Для отрисовки линии есть команда “отрезок” (LINE). При вызове она запрашивает первую точку, вторую и рисует отрезок. Пользователь мог указать любую точку пространства. Отметим это.
Представим теперь, что есть в Лиспе некая функция “рубить”. Как ее использовать мы должны узнать в справочнике по функциям. Лезем, якобы, в справочник. Читаем.
«Функция «рубить» выполняет рубление чего-то чем-то. В программе записывается так:
(рубить чем что),
где
рубить - имя функции;
чем - первый аргумент, на месте которого в программе следует писать название инструмента(топор, зубило). Тип аргумента: строка, регистр букв не имеет значения;
что - второй аргумент, на месте которого в программе следует писать часть название разрубаемого «тела». Тип: строка, регистр букв не имеет значения.
Пример.
(рубить "топор" "полено") - правильно;
(рубить "полено" "топор") - неправильно»
Следовательно, при использовании функции «рубить», оказывается, уже в программе нужно указать, чем и что рубить. А откуда берутся «топор» и «полено»?
Дело в том, что мы должны составить программу так, что вначале она выяснит, что и чем в данном случае надо, т.е.соберет исходные данные, а потом передаст эти данные уже в функцию «рубить». Собирая каждый раз различные данные, мы порубим в лапшу все что надо.
Однако прежде чем этим заняться, сделаем несколько важных выводов из этого несерьезного примера.
Вернемся к теме. Данные в автолиспе делятся на типы. Для начала рассмотрим целые числа, вещественные числа и строки.
Целые числа – это рациональные числа, т.е. состоящие только из цифр. Например, 1, 2, -3, -12545. Сюда относится и 0.
Вещественные числа состоят из цифр и десятичной точки. Например, 1.0, -1.0, -200.001.
Строки – это последовательность символов в кавычках. Проще говоря, все что мы можем ввести с клавиатуры, взятое в кавычки. Например, "1", "1.0", "йцукен", "123йцукен456", "!№;%".
Если в программе мы передаем данные в функцию в "натуральном" виде, т.е. аргументами будут строковые или числовые данные, то при каждой работе программы функция будет обрабатывать только эти, постоянные, данные. Они называются константами, так как текст программы не меняется. Он пишется как бы навсегда.
Для передачи в функцию различных данных для обработки наряду с константами мы часто будем использовать так называемые переменные. Это ни что иное, как поименованное место в памяти компьютера, т.е. способ хранить нечто в памяти. Этот механизм работает так же, как и файлы, в которых хранятся наши чертежи и всякие другие документы. Т.е. для сохранения данных нужно задать имя и собственно данные. При сохранении других данных под этим именем, первоначальные пропадают однозначно. В отличие от операционной системы, тут вас, однако, никто не одернет с интонациями Б.Гейтса: «А Вы точно уверены, что хотите удалить содержимое этой переменной?»
Показываю. Для демонстрации мы изучим нашу первую функцию автолиспа.
(setq имя1 данные1 имя2 данные2 … …)
Примечание. Запись выражений будет раскрашена так, как это делается в среде разработки лисп-приложений VisualLisp, про которую речь пойдет позже. А пока – привыкайте.
Для описания функции воспользуемся особым приемом, который назовем «способ чтения выражений». Поскольку функция – это действие, то и фразу начинаем с глагола:
- Запомнить под именем имя1 данные1, а под именем имя2 данные2 и т.д.
Этот прием чтения нужно освоить, ибо в трудную минуту он поможет разобраться, что же вы наваяли в вашей программе.
Выражения автолиспа можно вводить прямо в командной строке автокада (естественно в круглых скобках). «Ввести выражение в командной строке» означает напечатать его и нажать Enter. Попробуйте:
Command: (setq name1 1)
Command: (setq name2 1.0)
Command: (setq name3 “ку-ку”)
Command: (setq any 127.333)
Заметим, что после каждого нажатия Enter, в командной строке печатается именно то значение, которое мы запоминали в переменную. Это называется «функция вернула результат вычисления». Результатом вычисления функции setq является последнее переданное ей значение, которое она запомнила в соответствующую переменную. А, кстати, запомнила ли? Для чтения значения переменной в автокаде нужно в командной строке ввести имя этой переменной, предварив восклицательным знаком. Вот так:
Command: !name1
Command: !name2
Command: !name3
Command: !any
Автокад нам сразу же напечатает значение переменной, если оно есть. А если нет? Переменную bjaka мы не задавали («запомнить что-то под каким-то именем» так же называется «задание переменной»):
Введем !bjaka, автокад вернет nil. Это значит, в такой переменной ничего не храниться. Или, иными словами, такая переменная не задана. Теперь еще один эксперимент. Введите:
Command: (setq name1 name2)
а затем посмотрим что в name1:
Command: !name1
Ясно, что в name1 записалось значение переменной name2. Еще попробуем.
Сначала вспомним, что имеем:
Command: !name1
Command: !name3
Command: !any
Теперь:
Command: (setq name1 name3 name3 any)
и посмотрим опять:
Command: !name1
Command: !name3
Command: !any
Любому толковому курсанту нашего курса сразу ясно, что в name1 запомнилось значение name3, а потом в name3 запомнилось то, что было в переменной any. И это правильно. Автолисп вычисляет, как и мы, слева направо, сверху вниз.
Выводы:
Задание 1.
Начинать сразу с автолиспа. Понимание программирования не обязательно - придет в процессе гарантировано:-). Нужно неплохо знать автокад. Далее пример текста занятия. Усвоение материала проверено на практике. Текст составлен мною на основе очных практических занятий. Программирование осваивал самостоятельно (с 1991 года примерно), образование инженер-дорожник.
С уважением, Скляров И.Б.
Занятие 1
в котором мы будем учиться приказывать и выражаться
Тема: Программа. Функция. Выражение. Данные. Переменные.
Компьютерная программа – это последовательность команд для компьютера. Назначение программы - что-то рассчитать (или начертить, или и то, и другое). Условно, программу можно разделить на три части:
Т.е. в начале программы идут команды, которые обеспечивают ввод (или сбор) исходных данных, затем идет часть команд, которые эти данные обсчитывают, и последние из этой последовательности команд производят вывод результата. Иными словами, показывают человеку, что получилось.
Эти три части могут в одной программе повторяться или идти вперемешку. Но такую программу можно “поделить” на подпрограммы в соответствии означенному принципу.
Итак, программа – это последовательность команд, или, иными словами, “приказов” (в нашем случае, автокаду) сделать что-то. Поскольку компьютер абсолютный педант, то и приказы ему нужно отдавать четко, ясно и однозначно.
“Четко” – это значит правильно, без опечаток, писать имена команд (функций) и вообще все слова и цифры, что вы пишете в программе, “ясно” означает, что ставить слова в приказе нужно в определенном порядке, “однозначность” обязывает применять слова, подходящие по смыслу.
Такой вот приказ в автолиспе называется выражением. Но прежде чем прикоснуться к таинству записи выражений, лучше познакомиться с такой штуковиной, как функции автолиспа. Кратко: в автокаде есть команды, в автолиспе есть функции. Разница: команды автокада запрашивают данные у пользователя, функциям требуются в процессе написания программы. Т.е., описывая функцию, программист уже должен знать ответы на ее вопросы! Эти ответы называются аргументами функции, а, попросту говоря, это данные, которые она, функция, обработает.
Хочется добавить особо, что в автолиспе термин “функция” следует трактовать как нечто функционирующее, выполняющее что-то, т.е. некое действие. Меня, к примеру, в начале знакомства с этим языком и одновременно с программированием несколько сбили с толку школьные воспоминания о функциях и графиках. Здесь же, повторюсь, функция – это приказ компьютеру в лице автокада что-то сделать.
Чтобы выпутаться из этих формулировок, вот пример.
Вспомним работу команд в акаде. Для отрисовки линии есть команда “отрезок” (LINE). При вызове она запрашивает первую точку, вторую и рисует отрезок. Пользователь мог указать любую точку пространства. Отметим это.
Представим теперь, что есть в Лиспе некая функция “рубить”. Как ее использовать мы должны узнать в справочнике по функциям. Лезем, якобы, в справочник. Читаем.
«Функция «рубить» выполняет рубление чего-то чем-то. В программе записывается так:
(рубить чем что),
где
рубить - имя функции;
чем - первый аргумент, на месте которого в программе следует писать название инструмента(топор, зубило). Тип аргумента: строка, регистр букв не имеет значения;
что - второй аргумент, на месте которого в программе следует писать часть название разрубаемого «тела». Тип: строка, регистр букв не имеет значения.
Пример.
(рубить "топор" "полено") - правильно;
(рубить "полено" "топор") - неправильно»
Следовательно, при использовании функции «рубить», оказывается, уже в программе нужно указать, чем и что рубить. А откуда берутся «топор» и «полено»?
Дело в том, что мы должны составить программу так, что вначале она выяснит, что и чем в данном случае надо, т.е.соберет исходные данные, а потом передаст эти данные уже в функцию «рубить». Собирая каждый раз различные данные, мы порубим в лапшу все что надо.
Однако прежде чем этим заняться, сделаем несколько важных выводов из этого несерьезного примера.
Вернемся к теме. Данные в автолиспе делятся на типы. Для начала рассмотрим целые числа, вещественные числа и строки.
Целые числа – это рациональные числа, т.е. состоящие только из цифр. Например, 1, 2, -3, -12545. Сюда относится и 0.
Вещественные числа состоят из цифр и десятичной точки. Например, 1.0, -1.0, -200.001.
Строки – это последовательность символов в кавычках. Проще говоря, все что мы можем ввести с клавиатуры, взятое в кавычки. Например, "1", "1.0", "йцукен", "123йцукен456", "!№;%".
Если в программе мы передаем данные в функцию в "натуральном" виде, т.е. аргументами будут строковые или числовые данные, то при каждой работе программы функция будет обрабатывать только эти, постоянные, данные. Они называются константами, так как текст программы не меняется. Он пишется как бы навсегда.
Для передачи в функцию различных данных для обработки наряду с константами мы часто будем использовать так называемые переменные. Это ни что иное, как поименованное место в памяти компьютера, т.е. способ хранить нечто в памяти. Этот механизм работает так же, как и файлы, в которых хранятся наши чертежи и всякие другие документы. Т.е. для сохранения данных нужно задать имя и собственно данные. При сохранении других данных под этим именем, первоначальные пропадают однозначно. В отличие от операционной системы, тут вас, однако, никто не одернет с интонациями Б.Гейтса: «А Вы точно уверены, что хотите удалить содержимое этой переменной?»
Показываю. Для демонстрации мы изучим нашу первую функцию автолиспа.
(setq имя1 данные1 имя2 данные2 … …)
Примечание. Запись выражений будет раскрашена так, как это делается в среде разработки лисп-приложений VisualLisp, про которую речь пойдет позже. А пока – привыкайте.
Для описания функции воспользуемся особым приемом, который назовем «способ чтения выражений». Поскольку функция – это действие, то и фразу начинаем с глагола:
- Запомнить под именем имя1 данные1, а под именем имя2 данные2 и т.д.
Этот прием чтения нужно освоить, ибо в трудную минуту он поможет разобраться, что же вы наваяли в вашей программе.
Выражения автолиспа можно вводить прямо в командной строке автокада (естественно в круглых скобках). «Ввести выражение в командной строке» означает напечатать его и нажать Enter. Попробуйте:
Command: (setq name1 1)
Command: (setq name2 1.0)
Command: (setq name3 “ку-ку”)
Command: (setq any 127.333)
Заметим, что после каждого нажатия Enter, в командной строке печатается именно то значение, которое мы запоминали в переменную. Это называется «функция вернула результат вычисления». Результатом вычисления функции setq является последнее переданное ей значение, которое она запомнила в соответствующую переменную. А, кстати, запомнила ли? Для чтения значения переменной в автокаде нужно в командной строке ввести имя этой переменной, предварив восклицательным знаком. Вот так:
Command: !name1
Command: !name2
Command: !name3
Command: !any
Автокад нам сразу же напечатает значение переменной, если оно есть. А если нет? Переменную bjaka мы не задавали («запомнить что-то под каким-то именем» так же называется «задание переменной»):
Введем !bjaka, автокад вернет nil. Это значит, в такой переменной ничего не храниться. Или, иными словами, такая переменная не задана. Теперь еще один эксперимент. Введите:
Command: (setq name1 name2)
а затем посмотрим что в name1:
Command: !name1
Ясно, что в name1 записалось значение переменной name2. Еще попробуем.
Сначала вспомним, что имеем:
Command: !name1
Command: !name3
Command: !any
Теперь:
Command: (setq name1 name3 name3 any)
и посмотрим опять:
Command: !name1
Command: !name3
Command: !any
Любому толковому курсанту нашего курса сразу ясно, что в name1 запомнилось значение name3, а потом в name3 запомнилось то, что было в переменной any. И это правильно. Автолисп вычисляет, как и мы, слева направо, сверху вниз.
Выводы:
Задание 1.
Не нашли то, что искали? Задайте вопросы в сообществе или поделитесь своими знаниями.