Mengapa tidak membuat Lisp Anda sendiri untuk web?

Ada JavaScript - hal yang luar biasa. Dan itu sangat bagus untuk sebagian besar karena alat debugger dan debugging dibangun ke dalam setiap browser. Tanpa debugger dan inspektur pohon DOM, itu jauh lebih sulit untuk mengembangkan apa pun di JavaScript.


Jadi saya memutuskan untuk menyembunyikan Lisp saya, tetapi dengan debugger yang bagus. Saya mengambil littlelisp kecil yang sederhana dan mengembalikannya 99%. Saya mempertajamnya dengan eksekusi selangkah demi selangkah dan membuat IDE sendiri, sederhana namun berfungsi.


Hasilnya adalah sebagai berikut.


gambar

Bahasa itu sendiri ternyata merupakan campuran Lisp dan JavaScript, karena saya tidak tahu Lisp dengan baik, tetapi JavaScript baik :)


Contoh kode lebih lanjut.


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

Sebenarnya, proyek github sendiri ada di sini: https://github.com/SaemonZixel/littlelisp.js


Pada akhirnya, saya akan mengatakan bahwa kode ini masih dalam tahap beta (per 17 Mei 2020). Ada banyak kesalahan sejauh ini dan saya perlahan menemukannya dan memperbaikinya :(


Tapi kemudian debugger hampir seperti di lingkungan pengembangan Smalltalk berhasil melakukannya! :)


Anda dapat membawa kode langsung di debugger. Pilih fragmen kode apa pun dan lihat hasilnya atau jalankan debugger bersarang.


All Articles