Functional programming 具有AST运行时访问权限的编程语言/平台

Functional programming 具有AST运行时访问权限的编程语言/平台,functional-programming,programming-languages,common-lisp,metaprogramming,Functional Programming,Programming Languages,Common Lisp,Metaprogramming,我希望为一个简短的演示实现一些概念验证演示,在这个演示中,运行的代码知道当前正在执行的代码块的散列“值”。例如: function BBB(a) { a = 2 * a; print me.hash; --> "xxxxxxx" (value of BBB-syntax represenation) return a; } function AAA(a, b, c) { d = BBB(a);

我希望为一个简短的演示实现一些概念验证演示,在这个演示中,运行的代码知道当前正在执行的代码块的散列“值”。例如:

function BBB(a) {
  a = 2 * a;
  print me.hash;          --> "xxxxxxx" (value of BBB-syntax represenation)
  return a;                              
}

function AAA(a, b, c) {
  d = BBB(a);
  print me.hash;          --> "yyyyyyy" (value of AAA-Syntax representation, possibly dependant on value of BBB, but not necessary)
  return d;
}
我本能地转向了LISPish语言,但在Scheme方面还没有成功。我已经很长时间没有接触到CommonLisp了,我怀疑它可能能够做到(非常感谢)。它不需要很快,或者一个流行的平台,可以是最学术和最怪异的平台。这只是一个演示


有没有人知道一种语言/平台可以做到这一点,它几乎是开箱即用,或者只需相对较少的修改?我更喜欢使用某种解析的/treeish东西,而不是实际的源代码。

不是散列,但对于唯一的ID,可以使用Python对象标识。将每个函数放在自己的类中,然后使用。例如,在Python 3中:

class cBBB(object):
    def do(a):
        a=2*a
        print(self.id())    # self.id() is the "hash"-like unique value
        return a;
BBB = cBBB()     # now you can call BBB.do(a)

class cAAA(object):
    def do(a,b,c):
        d = BBB.do(a)
        print(self.id())    # self.id() is the "hash"-like unique value
        return d;
AAA = cAAA()     # now you can call AAA.do(a,b,c)

使用
\uuuu call\uuuu
可以更干净地完成此操作。例如,有关
\uuu调用的更多信息,请参见
您猜对了。Common Lisp可以非常轻松地完成此任务:

(defmacro reflective-defun (name args &body body)
  (let ((source-form `(reflective-defun ,name ,args ,@body)))
    `(let ((me ',source-form))
       (defun ,@(cdr source-form)))))

(reflective-defun bbb (a)
  (setf a (* 2 a))
  (print me)
  a)

(reflective-defun aaa (a b c)
  (let ((d (bbb a)))
    (print me)
    d))

(aaa 12 :x :y)
输出:

(REFLECTIVE-DEFUN BBB
    (A)
  (SETF A (* 2 A))
  (PRINT ME)
  A) 
(REFLECTIVE-DEFUN AAA
    (A B C)
  (LET ((D (BBB A)))
    (PRINT ME)
    D)) 
24
以下是如何编写自我重新定义函数:

(defun recursive-replace (tree what with)
  "Walks down the TREE and replaces anything that is EQUALP to WHAT with WITH."
  (cond ((equalp tree what)
         with)
        ((listp tree)
         (loop for item in tree
              collect (recursive-replace item what with)))
        (t tree)))

(reflective-defun ccc (a b c)
  (let ((d (bbb a)))
    (print me)
    (if (eql b :use-me-from-now-on)
        (eval (recursive-replace me '(bbb a) '(bbb b))))
    d))

顺便说一句,Scheme(以及宏所使用的任何语言)将竭尽全力阻止您创建一个名为
me
的标识符,该标识符可由传递给宏的源代码引用

在普通的Lisp中,一个正在运行的函数并不知道它自己。在特定的实现中,应该可以检查堆栈。除了缺少文档之外,卫生似乎是我与Julia所遭遇的障碍。非常感谢你!这正是我需要的。