Warum nicht dein eigenes Lisp für das Web machen?

Es gibt JavaScript - eine wunderbare Sache. Und es ist größtenteils schön, weil Debugger- und Debugging-Tools in jeden Browser integriert sind. Ohne einen Debugger und einen DOM-Bauminspektor war es viel schwieriger, etwas in JavaScript zu entwickeln.


Also habe ich beschlossen, mein Lisp zu zerschlagen, aber mit einem guten Debugger. Ich nahm ein kleines, einfaches kleines Stückchen und überarbeitete es zu 99%. Ich habe es durch schrittweise Ausführung geschärft und meine eigene IDE erstellt, einfach, aber funktionierend.


Das Ergebnis ist das Folgende.


Bild

Die Sprache selbst stellte sich als eine Mischung aus Lisp und JavaScript heraus, da ich Lisp nicht gut kannte, aber JavaScript ist gut :)


Weitere Codebeispiele.


(alert document.location.href)

(setq x "ok!") 
(alert (x.substring 0 2))

;;   if

(setq x (prompt "Value of X:"))
(if (x == null)
    (setq x "(none)")
    (alert (+ "x = " x))
:else
    (alert (+ "x = " x))
)

;;   while/if      

(setq i 0)
(while (i < 10)
    (console.log i)
    (++ i)
)

;;       

(x < 2)                ;; -> (< x 2)
((x < 2) && (x > -1))  ;; -> (&& (< x 2) (> x -1))
((x < 2) || (x > -1))  ;; -> (|| (< x 2) (> x -1))
(x + 1 2 3)            ;; -> (+ x 1 2 3) => x+1+2+3
(x ++)                 ;; -> (++ x) 
(++ x y z)             ;; ->   1  x, y, z 

;;    JS-

(setq obj1 (new Object))
(setq obj1.a 123 obj1.b "abc") ;;    

(setq name "c")
(setq obj1.@name ())           ;; @ - 
(setq obj1.@name.0 111)
(setq obj1.@name.1 222)
(setq obj1.@name.2 333) 

(alert (obj1.c.join " "))      ;;  "111 222 333"

;;  -   

(defclass 
    :extends Object
    :instvars "_ "
    :classvars ""
    :constructor init
)

(setq . 0)

(defmeth .init ( ) (
    (setq this. )
    (setq this._ )
    (. ++)
))

(defmeth . () (
    (window.alert (+ "  №" this. "  " this._ "   !"))
))

(setq 1 (new  9 " "))
(1.)
(alert (+ " : " .))

;;     

((lambda (x y) (alert (x + y)) "a" "b")

(defun f1 (x) (alert (x + " - ok!")))
(f1 "f1")

;;    -     JS-

((new Function "msg" "alert(msg);") document.title)

;;    

(catch (a.b)) ;;  Exception object (Error: "a" is undefined!)

Das Github-Projekt selbst befindet sich hier: https://github.com/SaemonZixel/littlelisp.js


Am Ende möchte ich sagen, dass sich der Code bisher in der Beta befindet (Stand: 17. Mai 2020). Bisher gibt es viele Fehler und ich finde sie langsam und korrigiere sie :(


Aber dann hat es der Debugger fast wie in Smalltalk-Entwicklungsumgebungen geschafft! :) :)


Sie können den Code direkt in den Debugger bringen. Wählen Sie ein beliebiges Codefragment aus und zeigen Sie das Ergebnis an oder führen Sie einen verschachtelten Debugger aus.


All Articles