COMMON LISP JP > Archives > 2018/06/07

2018/06/07 03:33:57 UTChojo
#
すっごい非効率なコードだと思いますが、なんとか読み込んだindex.lispに記述された複数のフォームをmapcarでぐるぐるevaluateStringすることができ、defmacroを利用することができるようになりました。
#
(global.jscl=require('jscl')).evaluateString(`
  (progn
    (defvar jscl (jscl::oget jscl::*ROOT* "jscl"))
    (defvar code ((jscl::oget jscl "evaluateString") (#j:String:prototype:concat "'(" (funcall (jscl::oget (require "fs") "readFileSync") "index.lisp" "utf-8") ")")))
    (mapcar (lambda (c) ((jscl::oget jscl "evaluateString") (write-to-string c))) code)
`)
2018/06/07 03:42:58 UTChojo
#
これから、ブラウザ側では<script type="text/x-common-lisp">CLコード</script> や <script type="text/x-common-lisp" src="外部CLファイル" /> でファイルを分けることで解決できないか試してみます!実は、一度試してみたのですが正しく動かず、サーバから静的ファイルのjscl.jsを配信する仕組みが無かったためjscl.jsをhtmlに無理やりねじ込む形を取っていたのですが、それが問題かなと思ってちゃんとしたテストができていませんでした!そこでこれからサーバ側からjscl.jsを取得できる仕組みを作り、まずは <script src="jscl.js" /> が機能するようにしてからようやくテストできそうです(∩´∀`∩)
2018/06/07 23:47:08 UTChojo
#
再びJSCLの質問になってしまうのですが、質問させてください><。文字列結合を行う際、#j:String:prototype:concat を利用していたのですが #jscl::concat が使えることがわかりました。しかし本来、Common LISPでは concatenate を使って文字列結合を行うことが多いようです。しかしJSCLのreplで concatenate を使うと ERROR: Function 'CONCATENATE' undefined と表示されて利用できないようなんです。試しにnodeのreplでjscl.CLにアクセスしてみたところ、内部的には concatenate がちゃんと定義されているようなのですが...なぜ利用できないのでしょうか??