【问题标题】:Anonymous functions in parenscriptparenscript 中的匿名函数
【发布时间】:2022-10-23 11:57:29
【问题描述】:

我有一些 JavaScript,以及 cl-who 做我想做的事:

      (:script :type "text/javascript"
           (cl-who:str
        "
$(document).ready(function ()
{$('#mtcars-table').DataTable({
ajax: { url: '/data?sym=mtcars&fmt=dt',
        dataSrc: 'mtcars' },
columns: [
{data: 'model', title: 'Model'},
{data: 'mpg', title: 'MPG'},
{data: 'cyl', title: 'Cylinders'},
{data: 'disp', title: 'Displacement'},
{data: 'hp', title: 'Horsepower'},
{data: 'drat', title: 'Axle Ratio'},
{data: 'wt', title: 'Weight'},
{data: 'qsec', title: 'Quarter mile time'},
{data: 'vs', title: 'V or Straight'},
{data: 'am', title: 'Transmission'},
{data: 'gear', title: '# gears'},
{data: 'carb', title: '# carbs'},
],
});
});
"))

但我在通过 ParenScript 转换为 JavaScript 时遇到了一些困难。目前,这似乎完成了我需要的大部分工作:

      (:script :type "text/javascript"
           (cl-who:str
             (ps:ps (ps:chain ($ document)
                 (ready (lambda ()
                      (foo)))))

这让我:

"$(document).ready(function () {
    __PS_MV_REG = [];
    return foo();
});"

来自 ParenScript,因此请不要将 foo 替换为 $(mtcars-table ...

达到这一点虽然是反复试验、错误和猜测,但我对 JavaScript 知之甚少。我不相信我这样做是“正确的方式”,ParenScript 的文档和教程很少。

任何专家都可以建议一种更好的方法来转换这个 JavaScript sn-p 吗?

【问题讨论】:

    标签: common-lisp parenscript


    【解决方案1】:

    首先,虽然我大多不 :use 一个包(在 defpackage 中),但我制作了一个单独的包 :use #:parenscript 因为否则会很痛苦。

    我使用了几个助手来减少 columns 数组的输入(group 在我的个人 util 库中,但我复制了它以防万一你需要它)

    (defun group (n seq)
      (if (zerop n)
          (error "0 length")
          (do ((result nil)
               (chunk nil nil))
              ((not seq) (nreverse result))
            (dotimes (i n)
              (push (car seq) chunk)
              (setf seq (cdr seq)))
            (push (nreverse chunk) result))))
    
    (defmacro+ps temporary-columns (&body forms)
      `(array ,@ (mapcar (lambda (pair)
                           `(create data ,(first pair)
                                    title ,(second pair)))
                         (group 2 forms))))
    
    (ps
      (chain ($ document)
             (ready (lambda ()
                      (chain ($ "#mtcars-table")
                             (-data-table (create ajax (create url "/data?sym=mtcars&fmt=dt"
                                                               data-src "mtcars")
                                                  columns (temporary-columns
                                                            "model" "Model"
                                                            "mpg" "MPG"
                                                            "cyl" "Cylinders"
                                                            "disp" "Displacement"
                                                            "hp" "Horsepower"
                                                            "drat" "Axle Ratio"
                                                            "wt" "Weight"
                                                            "qsec" "Quarter Mile Time"
                                                            "vs" "V or Straight"
                                                            "am" "Transmission"
                                                            "gear" "# gears"
                                                            "carb" "# carbs"))))))))
    

    扩展为:

    $(document).ready(function () {
        __PS_MV_REG = [];
        return $('#mtcars-table').DataTable({ ajax : { url : '/data?sym=mtcars&fmt=dt', dataSrc : 'mtcars' }, columns : [{ data : 'model', title : 'Model' }, { data : 'mpg', title : 'MPG' }, { data : 'cyl', title : 'Cylinders' }, { data : 'disp', title : 'Displacement' }, { data : 'hp', title : 'Horsepower' }, { data : 'drat', title : 'Axle Ratio' }, { data : 'wt', title : 'Weight' }, { data : 'qsec', title : 'Quarter Mile Time' }, { data : 'vs', title : 'V or Straight' }, { data : 'am', title : 'Transmission' }, { data : 'gear', title : '# gears' }, { data : 'carb', title : '# carbs' }] });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 2011-12-29
      • 2014-11-11
      • 2012-08-12
      • 2012-03-22
      相关资源
      最近更新 更多