Pourquoi ne pas créer votre propre Lisp pour le Web?

Il y a JavaScript - une chose merveilleuse. Et c'est beau pour la plupart parce que le débogueur et les outils de débogage sont intégrés dans chaque navigateur. Sans débogueur et inspecteur d'arborescence DOM, il était beaucoup plus difficile de développer quoi que ce soit en JavaScript.


J'ai donc décidé d'entailler mon Lisp, mais avec un bon débogueur. J'ai pris un petit peu simple et je l'ai refactorisé à 99%. Je l'ai affiné par une exécution pas à pas et j'ai créé mon propre IDE, simple mais fonctionnel.


Le résultat est le suivant.


image

Le langage lui-même s'est avéré être un mélange de Lisp et JavaScript, parce que je ne connaissais pas bien Lisp, mais JavaScript est bon :)


Autres exemples de code.


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

En fait, le projet github lui-même est ici: https://github.com/SaemonZixel/littlelisp.js


Au final, je dirai que le code est pour l'instant en version bêta (au 17 mai 2020). Il y a beaucoup d'erreurs jusqu'à présent et je les trouve lentement et les corrige :(


Mais alors le débogueur presque comme dans les environnements de développement Smalltalk a réussi à le faire! :)


Vous pouvez apporter le code directement dans le débogueur. Sélectionnez n'importe quel fragment de code et affichez le résultat ou exécutez un débogueur imbriqué.


All Articles