Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Лисп на басике


Автор: wwall 13.10.2006, 16:20
В книге Хендерсона Функциональное програмирование, как-то обойден вопрос реализации функции cons. Как эту функцию реализовать на Бесике? Или может кто делал Lisp на бейсике?

Автор: FatalError 25.10.2006, 16:00
Вопрос про Бейсик сложный. Lisp - такой язык, что допускает очень крутые изменения самим юзером, подстройку под себя. Соответственно, конечным результатом вполне может быть нечто вроде Бейсика. Как реальный вариант - язык программирования Euphoria:

www.rapideuphoria.com

Разработчики чего-то не сознаются, что за основу взяли Lisp, но уши явно торчат: язык интерпретируемый, данные хранятся как атомы с последовательностями... Правда, ОЧЧЕНЬ сильно переделали, надо сказать.

Еще можно как пример взять LUA:

www.lua.org

Это не совсем Бейсик, это скриптовый язык, что-то вроде помеси Лиспа с Паскалем. От Лиспа много больше осталось, чем в Euphoria.

Реализация функции cons - тоже, понятно, вопрос не простой. Согласно книжке Турецкого (David S. Touretzky, COMMON LISP: A Gentle Introduction to Symbolic Computation, скачал ее где-то) функция list создает односвязный список ссылок на ячейки памяти, увязанных попарно, причем одна ссылка указывает на данные, а вторая - на следующий элемент списка (следующую пару). Для последнего элемента правильного списка вторая ссылка - nil. Так вот, если я правильно понял, функция cons создает неправильный список ("точечную пару"), в которой обе ссылки указывают на данные. Как сделать односвязный список на Паскале при использовании указателей и динамической памяти, описано в любой книжке про TurboPascal. По аналогии, наверно, можно сделать и в Бейсике.

Автор: wwall 25.10.2006, 16:40
Беда в том что нет динамической памати как таковой. Самому ее приходиться. 
Все реализации лиспа которые смотрел в той или иной степени используют указатели. На сях это просто, но изобразить его на 1С - непросто.  Учитывая что басик наиболее близкий к 1с язык - хотел посмотреть может кто и писал лисп на нем и какую модель представления памяти использовал

Автор: skyboy 25.10.2006, 17:06
wwall, фиг знает этот 1С с бейсиком, но на java можно ведь списки на объектах мутить.. 1С поддерживает работу с объектами? полиморфизм и наследование реализовано?

Автор: wwall 26.10.2006, 08:16
нет. Нет этого. Память сейчас представляю в виде массива (хоть по длине и неограниченом). Проблема на самом деле при построении списка. никак не могу придумать

Автор: skyboy 26.10.2006, 11:31
Цитата(wwall @  26.10.2006,  07:16 Найти цитируемый пост)
Проблема на самом деле при построении списка. никак не могу придумать 

то есть, сформировать эмуляцию списка - можешь, а сформирорвать  - нет? а в чем отличие?
а структуры(записи в паскале) есть в 1С? а тип variant?

Автор: FatalError 27.10.2006, 08:54
Вот язык Lua, про который я в прошлом сообщении упомянул, возможно, будет полезен. Он создавался не как самостоятельный язык, а как вспомогательное средство, прикручиваемое к основной программе. Поэтому в нем прописаны крутые возможности взаимодействия с С (ну, поскольку вроде как по факту стандарт программирования). Можно вызывать Lua из С, можно вызывать из Lua функции, написанные на С, и много чего еще. Только Lua - это сильно видоизмененный Lisp, функций вроде cons и list там в явном виде нет, вместо них есть вполне удобный конструктор таблиц (списки в Lua называются таблицами, это практически полный аналог). И функциональность при работе с таблицами у Lua другая, чем у классического Лиспа. Там совсем другой подход реализован, по аналогии с массивами или со структурами в С. Будет ли такая штука взаимодействовать не с С, а с 1С, я не знаю. Если не пойдет, можно попытаться какой-нибудь буфер между ними сделать.

Автор: wwall 27.10.2006, 13:38
Все разобрался. Сам тупил. Спасибо skyboy подсказал. Спасибо всем. Скоро будет очередной трехколесный велосипед....  

Автор: skyboy 27.10.2006, 13:47
wwall, расскажи

Автор: wwall 27.10.2006, 13:59
Цитата(skyboy @  26.10.2006,  11:31 Найти цитируемый пост)
то есть, сформировать эмуляцию списка - можешь, а сформирорвать  - нет? 

Вот и все. Просто не мог понять очень долго что все лиспе - списки. Список - список, и эмуляция списка - тоже список... И нафиг не нужны указатели, достаточно индекса массива, и в принципе если головой подумать - массив сам тоже не нужен (заменил его на ТаблицуЗначений, есть такой объект в 1С). 
В добавок ко всему неправльно начал. Решил что проще переписать чужой код, а там ошибок - выше крыши... Как оказалось. Когда начал делать все сам - стало проще. По крайней мере на сегодня 
(setq x (cons 1 2))
(setq y (cons 3 4))
(setq z (cons x y))
(print z)
честно выводит ( ((1 . 2).(3 . 4)) . NIL)  

Зачем пишу этот интерпретатор - сам не знаю. Есть время. Есть желание. Может кому и потребуется. 
А заглядывая вперед, просто хочется иметь подомный инструмент под рукой. Хотя бы для прототипирования функций. Реализовать нормально тестирование на 1С - задача не для среднего ума. В отличие от лиспа smile

Когда закончу, выложу... 
Кстати, может его сделать по стандарту (точнее максимально близким к стандарту)? Будет ли выгода?

Автор: skyboy 27.10.2006, 14:14
Цитата(wwall @  27.10.2006,  12:59 Найти цитируемый пост)
Кстати, может его сделать по стандарту (точнее максимально близким к стандарту)? 

было бы отлично. 
Цитата(wwall @  27.10.2006,  12:59 Найти цитируемый пост)
Будет ли выгода?

не знаю. продавать будешь?
Цитата(wwall @  27.10.2006,  12:59 Найти цитируемый пост)
и в принципе если головой подумать - массив сам тоже не нужен 

не знал про таблицу. делал бы на индексах массива smile
Цитата(wwall @  27.10.2006,  12:59 Найти цитируемый пост)
Зачем пишу этот интерпретатор - сам не знаю. Есть время. Есть желание. Может кому и потребуется. 

Молодца! Конечно, потребуется... Я такое полгода назад под J2ME искал. не нашел. ищу время, чтоб начать изучать java - тогда тоже таким займусь smile

Автор: wwall 27.10.2006, 14:33
Цитата(skyboy @  27.10.2006,  14:14 Найти цитируемый пост)
Цитата(wwall @  27.10.2006,  12:59 Найти цитируемый пост)
не знаю. продавать будешь?


Нет.  Не того уровня велоспед. Когда научусь подменять интерпретатор 1С на лисп, так что бы вместо внутреннего языка использовался лисп - возможно. Но тут много технических трудностей. Да и не так много людей после басика смогут нормально ориентироваться в лиспе. Сам до сих пор не могу сказать что знаю его хотя бы на троечку, иногда бывает тупо смотрю в чужой код и тихо офигиваю - так тоже можно оказывается написать... А выгода имелось в виду что бы можно было уже готовый код на лиспе в этой поделке использовать... Мечта идиота - прикрутить CLOS...

В общем начинаю любить эти тра***тые скобочки. Но очень странною любовью. 
Кстати, тут в другом топике моя первая поделка по решению задачи на лиспе (перевозка с берега на берег), ради интереса решил переписать на 1С - выглядит убого... Но задачу решает smile

Автор: svg 28.10.2006, 10:35
посмотрите на http://ecls.sf.net, он специально создан для таких задач.

Автор: wwall 30.10.2006, 10:21
Посмотрю, спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)