Скомпилировать лисп-код. Вызвать из сторонней программы - Lisp

Узнай цену своей работы

Формулировка задачи:

Нужно скомпилировать лисп-код. И вызвать из другой программы (Delphi), незаметно для пользователя. При вызове лисп-кода ему передаются данные и возвращаются. Смотрел HomeLisp, но там СОМ. Для моей задачи это слишком. Если бы он умел без ActivX, было б здорово. А что есть еще? Пока трудность 1) в компиляции, и в 2) передачи/получении. На Racket удалось скомпилировать код (exe), (хоть и 9 Мб вместе с ядром), а вот передать/вернуть параметры, пока нет. Всё таки очень хочется получить dll-ку (пусть и не одну), с маленьким объёмом, и без СОМ-ов Это возможно? Если dll нет - пусть exe и/или несколько "метров"

PS.

Блин, вот столько лет лиспу (в общем смысле), а с компиляцией в exe/dll-файл так и ничего нет?! Нормальный файл, если я правильно выразился, а то может это называется не компиляция, а трансляция в С. Ну в общем, что бы это был чистый (native) код на С, способный работать уже без лиспового ядра!

Решение задачи: «Скомпилировать лисп-код. Вызвать из сторонней программы»

textual
Листинг программы
Sub TestLisp()
Dim myLisp As HomeLisp.clsLisp
    '::: Создание объекта
    Set myLisp = New HomeLisp.clsLisp
    With myLisp
         '::: Считаем факториалы целых
         For i% = 1 To 30
             '::: Формируем S-выражение (fact i)
             SExpr$ = "(fact " + CStr(i%) + ")"
             '::: Вычисляем...
             .SEval SExpr$
             '::: Получаем сообщение об ошибке
             ErrTxt$ = .Get_errormessage()
             '::: Ошибка была? 
             If ErrTxt$ <> "" Then
                '::: Да - сообщим об этом
                MsgBox "Ошибка: " + ErrTxt$
                Exit For
             Else
                '::: Нет - занесем результат    
                '::: в очередную ячейку
                Cells(i%, 1).Value = CStr(i%) + "!=" + .Get_Resp()
             End If
         Next i%
    End With
    '::: Уничтожим объект (хотя он и сам уничтожится!)
    Set myLisp = Nothing
End Sub

Объяснение кода листинга программы

  1. Создание объекта класса clsLisp
  2. Считаем факториалы целых от 1 до 30
  3. Формируем S-выражение (fact i) для каждого i от 1 до 30
  4. Вычисляем S-выражение с помощью метода SEval
  5. Получаем сообщение об ошибке, если таковая была
  6. Если есть сообщение об ошибке, выводим его и выходим из цикла
  7. Если сообщения об ошибке нет, вычисляем результат и записываем его в ячейку вместе с i
  8. Уничтожаем объект

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы