- BEE Lisp
-
Значимость предмета статьи поставлена под сомнение. Пожалуйста, покажите в статье значимость её предмета, добавив в неё доказательства значимости по частным критериям значимости или, в случае если частные критерии значимости для предмета статьи отсутствуют, по общему критерию значимости. Подробности могут быть на странице обсуждения.- Дата постановки шаблона: 16 октября 2011
BEE Lisp Класс языка: мультипарадигмальный: функциональное, процедурное программирование
Появился в: 2007
Автор(ы): Евгений Балабанов
Типизация данных: динамическая
Сайт: www.beelisp.com
Содержание
Что такое BEE Lisp
BEE Lisp — это легковесный расширяемый компилятор для языка Lisp, который позволяет создавать полностью автономные EXE и DLL файлы. В отличие от большинства аналогов, исполняемые файлы, созданные этим компилятором, не требуют присутствия каких-либо интерпретаторов или виртуальных машин. Его простой программный интерфейс для взаимодействия с операционной системой позволяет использовать DLL файлы, созданные сторонними разработчиками на других языках (таких как С++, Java,Python, C# и других).
COM интерфейсы
BEE Lisp предоставляет разработчикам открытые COM интерфейсы лексического анализатора и синтаксически-управляемого генератора кода. Таким образом, разработчики могут управлять процессом разбора и компиляции программно. Это позволяет без труда написать свою собственную среду разработки для BEE Lisp, хотя установщик BEE Lisp предусматривает интеграцию компилятора в PSPad по умолчанию.
Взаимодействие BEE Lisp и C++
Встроенные функции BEE Lisp и возможность создания DLL библиотек
Программы, написанные на BEE Lisp могут взаимодействовать с C++ (или любым другим компилируемым языком) через функции CALLAPI и CALL которые позволяют использовать сторонние DLL библиотеки из кода на Лисп. С другой стороны, C++ программы могут взаимодействовать с кодом на BEE Lisp, используя DLL, написанные и скомпилированные на BEE Lisp. C++ программы могут работать с атомами и списками через интерфейс LISPOBJECT.
Интерфейс LISPOBJECT
LISPOBJECT представляет собой интерфейс C++ (не COM), позволяющий программному обеспечению на компилируемых языках (С++, Delphi и т п) получать доступ к объектам Лиспа (спискам и атомам). Так же, стороннее ПО может создавать лисп-объекты с помощью функции CreateLispObject.
Объекты делятся на два больших класса:- атомы (это просто идентификаторы, строки, числа)
- списки — это списки атомов и списков.
Используя методы интерфейса, можно выяснить тип объекта. Существует несколько типов:- objATOM — собственно атом. Его имя можно получить методом objName. Так же, с атомом может быть связано какое-либо значение — его можно получить методом objGetItem с параметром 0.
- objLIST — список. Не содержит имени, его элементы можно получить методом objGetItem с указанием индекса элемента.
- ObjСNUMBER — число. Его имя представляет собой строковое представление числа. Подэлементов не содержит.
- ObjСSTRING — строка с завершающем нулем. Его имя представляет собой строку.
Примеры программ
Hello world
(print "Hello, world!\n")
Простейший интерактивный интерпретатор Lisp
(setf $EVAL_ERROR$ 0) ;This line enables exception handling - see documentation (defun println(str) ; print line user function (print str ) (print "\n") ) (defun quit() (callapi "ExitProcess" "kernel32.dll" 0) ) (setf T 1) (setf NIL 0) (println "BEE LISP Interactive Programming system") (println "To exit, type (QUIT)") (loop T (print ">") (println( eval (read) ) ) )
Windows Блокнот на BEE Lisp (LispPad)
include "struct.lsp" (freeconsole) (setf ofn (malloc 4096)) ; define some constants (setf WM_CREATE 1) (setf buffer (malloc 65540) ) (setf WS_CHILD (hex "40000000") ) (setf WS_VISIBLE (hex "10000000" )) (setf WS_VSCROLL (hex "00200000")) (setf WM_COMMAND (hex "111")) (setf WM_SIZE 5) (setf ES_MULTILINE 4) (setf editID 1000) (setf hEdit 0 ) (setf EDIT_CUT 11) (setf EDIT_COPY 12) (setf EDIT_PASTE 13) (setf EDIT_UNDO 14) (setf FILE_NEW 1) (setf FILE_OPEN 2) (setf FILE_SAVE 3) (setf FILE_EXIT 4) (setf HELP_ABOUT 21) (setf fName 0) (defstruct 'RECT '(left 4 top 4 right 4 bottom 4 ) ) (setf pWindowProc (defbin windowProc (hWnd1 dwMessage1 wParam1 lParam1) (cond ( (eq dwMessage1 WM_CREATE) ; condition (setf flags 0) (setf flags (bor flags WS_CHILD WS_VSCROLL ES_MULTILINE WS_VISIBLE ) ) (setf hEdit ( callapi "CreateWindowExA" "user32.dll" 0 "EDIT" 0 flags 0 0 0 0 hWnd1 editID (hex "00400000") 0 ) ) (setf hMainMenu (callapi "CreateMenu" "user32.dll" ) ) ; Create FILE Menu (setf hFileMenu (callapi "CreatePopupMenu" "user32.dll" ) ) (callapi "AppendMenuA" "user32.dll" hFileMenu 0 FILE_NEW "New") (callapi "AppendMenuA" "user32.dll" hFileMenu 0 FILE_OPEN "Open") (callapi "AppendMenuA" "user32.dll" hFileMenu 0 FILE_SAVE "Save") (callapi "AppendMenuA" "user32.dll" hFileMenu 0 FILE_EXIT "Exit") (callapi "AppendMenuA" "user32.dll" hMainMenu 16 hFileMenu "File") ; Create EDIT Menu (setf hEditMenu (callapi "CreatePopupMenu" "user32.dll" ) ) (callapi "AppendMenuA" "user32.dll" hEditMenu 0 EDIT_CUT "Cut") (callapi "AppendMenuA" "user32.dll" hEditMenu 0 EDIT_COPY "Copy") (callapi "AppendMenuA" "user32.dll" hEditMenu 0 EDIT_PASTE "Paste") (callapi "AppendMenuA" "user32.dll" hEditMenu 0 EDIT_UNDO "Undo") (callapi "AppendMenuA" "user32.dll" hMainMenu 16 hEditMenu "Edit") ; CREATE HELP MENU (setf hHelpMenu (callapi "CreatePopupMenu" "user32.dll" ) ) (callapi "AppendMenuA" "user32.dll" hHelpMenu 0 HELP_ABOUT "About") (callapi "AppendMenuA" "user32.dll" hMainMenu 16 hHelpMenu "Help") (callapi "SetMenu" "user32.dll" hWnd1 hMainMenu) (Exit 0) ) ; dwMessage1 == WM_CREATE clause ( (eq dwMessage1 WM_SIZE) ; condition (callapi "MoveWindow" "user32.dll" hEdit 0 0 (bitwise-and lparam1 (hex "FFFF")) (shr (bitwise-and lparam1 (hex "FFFF0000")) 16 ) 1) (EXIT 0) ); dwMessage1 == WM_SIZE ( (and (eq dwMessage1 WM_COMMAND) (eq lparam1 0 ) ) ; condition (let menuId wparam1) (setf szFname (malloc 4096) ) (cond ( (eq menuId FILE_NEW) (setf fname 0) (setstring buffer "") (callapi "SendMessageA" "user32.dll" hEdit 12 0 buffer) ) ( (eq menuID FILE_OPEN ) (setdword ofn 0 (hex "4C")) (setdword ofn 28 szFName ) (setdword ofn 32 255 ) (callapi "GetOpenFileNameA" "comdlg32.dll" ofn) (setf fName (getstring szFname) ) (load szfname buffer) (callapi "SendMessageA" "user32.dll" hEdit 12 0 buffer ) ) ( (eq menuID FILE_SAVE ) (cond ( (eq fName 0) (setdword ofn 0 (hex "4C")) (setdword ofn 28 szFName ) (setdword ofn 32 255 ) (callapi "GetSaveFileNameA" "comdlg32.dll" ofn) (setf fName (getstring szFname) ) ) ) (callapi "SendMessageA" "user32.dll" hEdit 13 65580 buffer ) (save fname buffer) ) ( (eq menuID FILE_EXIT ) (callapi "ExitProcessA" "kernel32.dll" 0) ) ( (eq menuID EDIT_CUT ) (callapi "SendMessageA" "user32.dll" hEdit (hex "300") 0 0 ) ) ( (eq menuID EDIT_COPY ) (callapi "SendMessageA" "user32.dll" hEdit (hex "301") 0 0 ) ) ( (eq menuID EDIT_PASTE ) (callapi "SendMessageA" "user32.dll" hEdit (hex "302") 0 0 ) ) ( (eq menuID EDIT_UNDO ) (callapi "SendMessageA" "user32.dll" hEdit (hex "304") 0 0 ) ) ( (eq menuID HELP_ABOUT ) (callapi "MessageBoxA" "user32.dll" hEdit "LISP PAD 1.0 Sample" "LISP PAD" 0 ) ) ) (EXIT 0) ) ) ( callapi "DefWindowProcA" "user32.dll" hWnd1 dwMessage1 wParam1 lParam1) ) ) (setf brush (callapi "GetStockObject" "GDI32.DLL" 1) ) (setf pWNDCLASS (CreateObject :Window ) ) (setf pMSG (malloc 128) ) (setval pWNDCLASS:Style 3) ;CS_HREDRAW | VREDRAW (setval pWNDCLASS:WndProc pWindowProc ) (setval pWNDCLASS:hInstance (hex "00400000") ) (setval pWNDCLASS:hIcon 0 ) (setval pWNDCLASS:hCursor 0 ) (setval pWNDCLASS:hbrBackGround brush ) (setf _lpszClassName (malloc 4096)) (setstring _lpszClassName "WinEx1" ) (setval pWNDCLASS:lpszClassName _lpszClassName) (callapi "RegisterClassA" "user32.dll" ( aref pWNDCLASS 1)) (setf h (callapi "CreateWindowExA" "user32.dll" 768 "WinEx1" "LISPPAD 1.0" 13565952 100 100 300 300 0 0 (hex "00400000") 0)) (setf msg (malloc 4096) ) (callapi "ShowWindow" "user32.dll" h 5) (callapi "UpdateWindow" "user32.dll" h ) (setf fin 1) (loop ( not (eq fin (hex "FFFFFFFF"))) (setf fin ( callapi "GetMessageA" "user32.dll" msg h 0 0)) (callapi "TranslateMessage" "user32.dll" msg) (callapi "DispatchMessageA" "user32.dll" msg) )
Ссылки
Категории:- Появились в 2007 году
- Языки программирования по алфавиту
- Компиляторы
- Языки программирования семейства Лисп
Wikimedia Foundation. 2010.