您可以使用哪种语言动态地重写功能?

Tom*_*ter 5 lisp programming-languages dynamic-languages

我最近有必要动态地在javascript中重写javascript函数.我做的很容易,而且有多么有趣,让我很震惊.

在这里我有一些HTML:

<div id="excelExport1234" 
     onclick="if(somestuff) location.href='http://server/excelExport.aspx?id=56789&something=else'; else alert('not important');"
  >Click here to export to excel</div>
Run Code Online (Sandbox Code Playgroud)

我无法更改输出的HTML,但我需要为该链接添加一个额外的参数.我开始考虑它,并意识到我可以这样做:

excelExport = $('excelExport1234');
if (needParam)
        eval('excelExport.onclick = ' + excelExport.onclick.toString().replace("excelReport.aspx?id", "excelReport.aspx?extraParam=true&id") + ';');
else
        eval('excelExport.onclick = ' + excelExport.onclick.toString().replace("extraParam=true&", "") + ';');
Run Code Online (Sandbox Code Playgroud)

它就像一个冠军!excelExport.onclick返回一个函数对象,我将其转换为字符串,然后执行一些字符串操作.由于它现在采用"function(){...}"的形式,我只需返回并将其分配给dom对象的onclick事件.不得不使用eval有点难看,但是AFAIK没有一个javascript函数构造函数可以接受一串代码并很好地将它变成一个对象.

无论如何,我的观点并不是我非常聪明(我不是),我的观点是这很酷.我知道javascript不是唯一可以做到这一点的语言.我听说过lisp为了这个目的已经有多年的宏了.除了真正的grok宏你需要真正grok lisp,我不会理解它,我只是'得到它'.

所以我的问题是:在其他语言中你能(轻松地)动态地重写函数,你能告诉我一个简单的例子吗? 我想看看你能做到的其他地方,以及它是如何完成的!

(另外,我不知道该怎么标记,所以我随机猜测)

Fal*_*ina 9

LISP是这方面的终极语言.LISP函数是实际的LISP列表,这意味着您可以像操作任何其他数据结构一样操作LISP源代码.

以下是它如何工作的一个非常简单的例子:

(define hi 
  (lambda () (display "Hello World\n")))
;; Displays Hello World
(hi)
(set! hi
      (lambda () (display "Hola World\n")))
;; Displays Hola World
(hi)
Run Code Online (Sandbox Code Playgroud)

但是,在函数是第一类对象的任何语言中都可以这样做.LISP的这种语法的最有趣的展示之一是在它的宏系统中.我真的不觉得我可以做正义的主题,所以如果你感兴趣,请阅读这些链接:

http://en.wikipedia.org/wiki/Macro_(computer_science)#Lisp_macros

http://cl-cookbook.sourceforge.net/macros.html

  • 称Lisp为"LISP"是20世纪的呐喊.:-) (5认同)

Chr*_*uin 1

我以前在 TCL 一直这样做,很轻松,效果也很好。我可以通过网络调查某些事物的接口,然后动态创建一个定制的接口来访问和控制事物。例如,您可以从通用 SNMP 库创建自定义 SNMP 接口。

我还没有使用过它,但 C# 有一些内置的支持来生成它自己的字节码,这相当令人印象深刻。

我也用 C 语言做过类似的事情,但它是不可移植的,而且几乎不值得这么麻烦。这是一种有时用于“自优化”代码的技术,用于生成适当的 C 函数以最佳地处理给定的数据集。