spiderbasic with newlisp-js

Hier könnt ihr alle Fragen zu SpiderBasic austauschen.
HPW
Beiträge: 17
Registriert: 30.08.2004 17:32

spiderbasic with newlisp-js

Beitrag von HPW »

Hallo,

Seit einiger Zeit habe ich mich für die Integration des newlisp-js Interpreters in spiderbasic interessiert.

https://forums.spiderbasic.com/viewtopi ... =16&t=1174

Zunächst ging es nicht recht voran.
Mit der Entwicklung von falsam's Babylon Modul und Peter's HtmlPreprozessor waren die Möglichkeiten aber nun vorhanden.

Hier ist dann mal ein erster Test:

Test-app: http://www.hpwsoft.de/nls/

Ich hoffe das Fred in einer zukünftigen Version von sb die Möglichkeit zur Einbettung beliebiger Javascript codes an beliebigen Stellen im generiertem Code ermöglicht.

Grüsse,
Hans-Peter
Hans-Peter
WYSE
Beiträge: 5
Registriert: 24.11.2014 19:23

Re: spiderbasic with newlisp-js

Beitrag von WYSE »

Hallo Hans-Peter,

Scripte sind doch immer wieder etwas tolles :-)

Der Link zu deinem Beispiel spiderlisp.zip unter Spiderbasic funktioniert leider nicht

Könntest Du bitte danach schauen?

VG
Wolfgang
HPW
Beiträge: 17
Registriert: 30.08.2004 17:32

Re: spiderbasic with newlisp-js

Beitrag von HPW »

Hallo Wolfgang,

Das Zip war nur eine Beispiel Html und die newlisp-js lib für den gesuchten Erst-Helfer zum Spiderbasic-Start.
Da hat sich dann leider nichts getan. Vom Mitlesen der Probleme beim Babylon-js projekt bin ich dann selber zur Lösung gekommen. Daher hatte ich aufgeräumt und die Testdaten-Zip gelöscht. Habe den Link gelöscht.

Den bisherigen Stand sieht man wie schon gepostet hier: http://www.hpwsoft.de/nls/
Der Jnfo-Button verlinkt zu:
http://www.hpwsoft.de/nl/README.html

Eine komplette IDE:
http://www.hpwsoft.de/nlide/

Oder worum geht es?

Grüsse,
Hans-Peter
Hans-Peter
WYSE
Beiträge: 5
Registriert: 24.11.2014 19:23

Re: spiderbasic with newlisp-js

Beitrag von WYSE »

Hallo Hans-Peter

habe es mir noch ein wenig angeschaut - aber dieser entscheidende Hinweis, der fehlt mir noch:
Deins funktioniert ja soweit


In etwa ist meine Nachbildung das von dir, doch wie bekomme ich das Ganze lauffähig?
Das Script im HTML unter Body habe ich manuell eingefügt.

Worum es geht? Nicht unbedingt um das Ergebnis als vielmehr um die nötigen Schritte

Code: Alles auswählen

Enumeration
  #window1
  #G_script
  #G_combo
  #G_runlisp
  #G_edit
EndEnumeration

Procedure.s lispcall(in1$)
  Protected temp$="nil"
  ! temp$ = newlispEvalStr(in1$) 
  temp$ = temp$ +"t"
  ProcedureReturn temp$
EndProcedure

Procedure gadgetevents()
  Protected newlispresultstr$=""
  Select EventGadget()
    Case #G_combo
      SetGadgetText(#G_script,GetGadgetText(#G_combo))
    Case #G_runlisp 
      Debug GetGadgetText(#G_script)
      Debug lispcall(GetGadgetText(#G_script))
      newlispresultstr$ =  lispcall(GetGadgetText(#G_script))
      SetGadgetText(#G_edit,newlispresultstr$);
        
EndSelect
  ProcedureReturn 0;
EndProcedure

If (OpenWindow(#window1,100,100,400,430,"Lisp Test"))
top=20;
gadgetheight=28;
ComboBoxGadget(#G_combo,20,top,360,gadgetheight);
top=(top+30);
AddGadgetItem(#G_combo,-1,"(sys-info)");
AddGadgetItem(#G_combo,-1,"(symbols)");
AddGadgetItem(#G_combo,-1,"(setq Test1 10)");
AddGadgetItem(#G_combo,-1,"(setq Test2(+ Test1 20))");
AddGadgetItem(#G_combo,-1,"Test1");
AddGadgetItem(#G_combo,-1,"Test2");
SetGadgetState(#G_combo,0);
StringGadget(#G_script,20,top,360,gadgetheight,"");
top=(top+30);
ButtonGadget(#G_runlisp,20,top,360,gadgetheight,"run lisp");
top=(top+30);
EditorGadget(#G_edit,20,top,360,270);
StringGadget(7,20,390,360,gadgetheight,"");
DisableGadget(#G_runlisp,1);
DisableGadget(7,1);
GadgetToolTip(#G_combo,"auswahl");
GadgetToolTip(#G_runlisp,"lisp");
SetGadgetText(#G_script,GetGadgetText(#G_combo))
Debug "START"
BindEvent(#PB_Event_Gadget,@gadgetevents());
EndIf


und die HTML-seite sieht in etwa so aus:

Code: Alles auswählen

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<script type="text/javascript">var spider = {}; spider.nbModules = 1; spider.nbLoadedModules = 0;</script>

<title>test</title>

<script type="text/javascript">function onLoad() { spiderCheckBrowser(); }</script>
<script type="text/javascript" src="spiderbasic/platform.js"></script>
<script type="text/javascript" src="spiderbasic/init.js"></script>
<script type="text/javascript">dojoConfig.baseUrl = 'spiderbasic/'; </script>
<script type="text/javascript" src="spiderbasic/dojo/dojo.js"></script>
<script type="text/javascript" src="spiderbasic/main.js"></script>
<script type="text/javascript" src="spiderbasic/debug.js"></script>
<link rel="stylesheet" href="spiderbasic/dojo/themes/flat/flat.css" />
<link rel="stylesheet" href="spiderbasic/dojo/dgrid/css/dgrid.css" />
<script type="text/javascript" src="spiderbasic/xdate.min.js"></script>
<link rel="stylesheet" title="Default" href="spiderbasic/themes/flat/window.css" type="text/css"/>
<script type="text/javascript" src="spiderbasic.js"></script>

</head>

<body oncontextmenu="return false;" class="flat" id="spiderbody" onload="onLoad()">

    <script type='text/javascript'>
      var Module = {
        preRun: [],
        postRun: [(function() {
          newlispEvalStr = Module.cwrap('newlispEvalStr', 'string', ['string']); 
        })],
        print: (function() { return function(text) { }; })(),
        printErr: function(text) { },
        setStatus: function(text) {
            spider_DisableGadget(#G_runlisp,0);
            spider_SetGadgetText(7,text);
        }
      };
    </script>
<script async type="text/javascript" src="newlisp-js-lib.js"></script>
</body>
</html>
HPW
Beiträge: 17
Registriert: 30.08.2004 17:32

Re: spiderbasic with newlisp-js

Beitrag von HPW »

Hallo,

Hier mal meine bisherige Version:

newlisp.sbi

Code: Alles auswählen

;newlisp-js for SpiderBasic 
;Version     : 1.0.0

DeclareModule NEWLISP
  ;-Engine.sbi
  Declare.s  newlispCall(sourcestring.s)
EndDeclareModule

Module NEWLISP
  IncludeFile "nlengine.sbi"   
EndModule
nlengine.sbi

Code: Alles auswählen

;newlisp-js for SpiderBasic : Nlengine 

Procedure.s newlispCall(sourcestring$)    
!     v_callnewlispresultstr = newlispEvalStr(v_sourcestring$);     
      ProcedureReturn callnewlispresultstr.s
EndProcedure
Newlisp.sb

Code: Alles auswählen

;newlisp.sbi - Simple Test
;!  <HtmlPreprocessor>
;!    [
;!      {
;!        "search": "</body>",
;!        "replace": "    <script type='text/javascript'>\n
;!      var Module = {\n
;!        preRun: [],\n
;!        postRun: [(function() {\n
;!          newlispEvalStr = Module.cwrap('newlispEvalStr', 'string', ['string']); \n
;!        })],\n
;!        print: (function() { return function(text) { }; })(),\n
;!        printErr: function(text) { },\n
;!        setStatus: function(text) {\n
;!            spider_DisableGadget(3,0);\n
;!            spider_SetGadgetText(7,text);\n
;!        }\n
;!      };\n
;!    </script>\n
;!<script async type=\"text/javascript\" src=\"newlisp-js-lib.js\"></script>\n
;!</body>"
;!      }
;!    ]
;!  </HtmlPreprocessor>

IncludeFile "newlisp/newlisp.sbi"

UseModule NEWLISP

#WindowWidth  = 400
#WindowHeight = 430

Procedure CloseWindowEvent()
  CloseWindow(EventWindow())
EndProcedure

Procedure GadgetEvents()
  Select EventGadget()
      
    Case 1 ; Select
      SetGadgetText(2, GetGadgetText(1)) ; Get the current item from the Combobox.
  
    Case 3 ; Call
      newlispsource.s = GetGadgetText(2)
;     Debug  newlispsource  
;     ! alert (v_newlispsource);
;      ! v_newlispresultstr = newlispEvalStr(v_newlispsource);     
;     Debug  newlispresultstr
     newlispresultstr.s = newlispCall(newlispsource.s)
;     Debug  newlispresultstr
      SetGadgetText(6,newlispresultstr)
    Case 4 ; Info
      !window.open('README.html','MsgWindow');
    Case 5 ; Doku     
      !window.open('manual_frame.html','MsgWindow');
  EndSelect
  
EndProcedure

If OpenWindow(0, 100, 100, #WindowWidth, #WindowHeight, "newlisp-js Demonstration", #PB_Window_TitleBar)
    
  Top = 20
  GadgetHeight = 28

  ComboBoxGadget(1, 20, Top, 360, GadgetHeight) : Top+30
    AddGadgetItem(1, -1, "(sys-info)")
    AddGadgetItem(1, -1, "(symbols)")
    AddGadgetItem(1, -1, "(setq Test1 10)")
    AddGadgetItem(1, -1, "(setq Test2(+ Test1 20))")
    AddGadgetItem(1, -1, "Test1")
    AddGadgetItem(1, -1, "Test2")
  SetGadgetState(1,0)
  StringGadget(2,  20, Top, 360, GadgetHeight, "(sys-info)") : Top+30
  ButtonGadget(3,  20, Top, 100, GadgetHeight, "newlisp-call")
  ButtonGadget(4, 130, Top, 120, GadgetHeight, "newlisp-js info")
  ButtonGadget(5, 260, Top, 120, GadgetHeight, "newlisp-js Doku") : Top+30
  EditorGadget(6,  20, Top, 360, 270)
  StringGadget(7,  20, 390, 360, GadgetHeight, "")
  DisableGadget(3,1)
  DisableGadget(7,1)
    
  GadgetToolTip(1,"Select newlisp string")
  GadgetToolTip(2,"Enter newlisp string")
  GadgetToolTip(3,"Call newlisp string")

  BindEvent(#PB_Event_Gadget, @GadgetEvents())
  BindEvent(#PB_Event_CloseWindow, @CloseWindowEvent())
  
  CompilerIf #PB_Compiler_OS <> #PB_OS_Web
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  CompilerEndIf
EndIf
Mittels des Tools HtmlPreprocessor wird die JavaScript-Ladefunction eingebaut die nach dem asycronen Laden im postrun die funtionen definiert bzw ausführt. Das wird vom emscripten-code so aufgerufen.

Edit: Noch ein Hinweiss: Lokal nur mit Firefox und auf Server mit allen 'modernen' Browsern.

Grüsse,
Hans-Peter
WYSE
Beiträge: 5
Registriert: 24.11.2014 19:23

Re: spiderbasic with newlisp-js

Beitrag von WYSE »

Ja, das hat geklappt.

Zwar noch nicht lokal auf dem IIS aber auf dem NAS.

Solche kleinen Projekte kann ich ganz gut verstehen - da ist immer noch genug neues für mich dabei,
vielen Dank.

Ich erinnere mich auch wieder: "Land of Lisp, die Mutter der funktionalen Programmiersprachen" und
auch an die vielen Klammern ;-)
HPW
Beiträge: 17
Registriert: 30.08.2004 17:32

Re: spiderbasic with newlisp-js

Beitrag von HPW »

Hallo,

Prima das es jetzt klappt.
...auch an die vielen Klammern ;-)
was für einen Lisp Neuling zunächst abschreckend wirkt ist eigentlich eine Stärke.
Mit einem guten Editor verliert es das Problem.
Wenn die Strukturen dann mal etwas umfangreicher werden, weiss man es zu schätzen wenn man von der öffnenen Klammer zur schliessenden springen kann.
Und Lisp mit seinem fliessendem Übergang von Code zu Daten und anders rum, hat damit eine enorme Mächtigkeit.
Newlisp darf man auch nicht mit den Common-Lisp Dickschiffen in einen Hut werfen.
Klein und kompakt, läuft fast überall und trotzdem relativ mächtig.

Grüsse,
Hans-Peter
Hans-Peter
Antworten