BEE Lisp

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

Ссылки


Wikimedia Foundation. 2010.

Игры ⚽ Нужен реферат?

Полезное


Смотреть что такое "BEE Lisp" в других словарях:

  • Lisp — Лисп Семантика: мультипарадигмальный: объектно ориентированное, функциональное, процедурное программирование Появился в: 1958 г. Автор(ы): Джон Маккарти Типизация данных: сильная, динамическая …   Википедия

  • The 25th Annual Putnam County Spelling Bee — Infobox Musical name= The 25th Annual Putnam County Spelling Bee caption=Original Cast Recording music=William Finn lyrics=William Finn book=Rachel Sheinkin basis= productions= 2004 The Berkshires workshop 2005 Broadway 2006 Melbourne 2006 San… …   Wikipedia

  • Лисп — Семантика: мультипарадигмальный: объектно ориентированное, функциональное, процедурное программирование Появился в: 1958 Автор(ы): Джон Маккарти Типизация данных …   Википедия

  • ЛИСП — Семантика: мультипарадигмальный: объектно ориентированное, функциональное, процедурное программирование Появился в: 1958 г. Автор(ы): Джон Маккарти Типизация данных: сильная, динамическая Диалекты: Common …   Википедия

  • Fibonacci number — A tiling with squares whose sides are successive Fibonacci numbers in length …   Wikipedia

  • List of Bucky O'Hare characters — This article is about characters who appear in Bucky O Hare and the Toad Wars. Contents 1 S.P.A.C.E. Members and Allies 1.1 Commander Dogstar 1.2 Mimi LaFloo 1.3 Wolf …   Wikipedia

  • MADtv recurring characters — This article contains synopses for many of the more noteworthy recurring characters and sketches that have appeared on the sketch comedy television series MADtv. Contents: Top · 0–9 · A B C D E F G H I J K L M N O P Q R S T U V …   Wikipedia

  • Blue Network — NBC Blue Network/ Blue Network Type Radio …   Wikipedia

  • List of Princeton University people — This is a table of notable people affiliated with Princeton University, including graduates of the undergraduate college and all graduate programs, former students, and former professors. Some noted current faculty are also listed in the main… …   Wikipedia

  • List of Family Guy characters — The Griffin family Back: Lois, Peter, Meg, and Chris; Front: Brian and Stewie These are characters from the animated American TV series Family Guy. Characters are only listed once, normally under the first applicable subsection in the list; very… …   Wikipedia


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»