Lt304888.ru

Туристические услуги

BEE Lisp

22-10-2023

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)
 
)

Ссылки

  • http://www.beelisp.ru
  • http://www.beelisp.com

BEE Lisp.

© 2020–2023 lt304888.ru, Россия, Волжский, ул. Больничная 49, +7 (8443) 85-29-01