Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 拥有宏真的需要同源性吗?_Macros_Clojure_Lisp - Fatal编程技术网

Macros 拥有宏真的需要同源性吗?

Macros 拥有宏真的需要同源性吗?,macros,clojure,lisp,Macros,Clojure,Lisp,2012-02-04由“同源性”一词赞助 背景:我将要选择购买哪本关于Clojure的书——或者(四月底推出)“Clojure编程”(你可以通过,一半的页面是可见的)。令我震惊的是,在这两本书中,这一特性——同象性——得到了如此多的强调 因为Clojure的根是基于Lisp的,所以我提到的这真的很重要。嗯,我可以看到宏的详细解释,但我没有抓住提到的重点。现在比较一下(引用“Clojure in Action”) 这种同象性也是Clojure的宏观系统得以实现的原因 如果没有它,宏几乎是不可能的。

2012-02-04由“同源性”一词赞助

背景:我将要选择购买哪本关于Clojure的书——或者(四月底推出)“Clojure编程”(你可以通过,一半的页面是可见的)。令我震惊的是,在这两本书中,这一特性——同象性——得到了如此多的强调

因为Clojure的根是基于Lisp的,所以我提到的这真的很重要。嗯,我可以看到宏的详细解释,但我没有抓住提到的重点。现在比较一下(引用“Clojure in Action”)

这种同象性也是Clojure的宏观系统得以实现的原因

如果没有它,宏几乎是不可能的。即使是维基百科的声明(上面的链接)也更为平衡,但这些来源(*)中没有一个考虑到有利于英语语法的人为因素

如果我没有弄错的话,宏语法(类似Lisp)在C#中是可能的(例如),只要C#团队付出更多努力。但这是设计师团队的成本,而不是用户的成本(?)。第二,习惯很重要。如果在现实生活中,你认为“A+B”,在计算机世界中,你不断地把它翻译成“+A”,生产力受到影响(我可以从我自己看到,当我从C++函数到C语言lambdas)时。 Clojure程序员几乎像AST一样直接编写程序,这一赞扬让我感到害怕,因为我读到“由于直接用十六进制代码编写代码,你不仅能记住十六进制系统,而且更接近机器”

总而言之——我喜欢元编程,我喜欢Lisp类宏(虽然我不是Lisper),但我在这里看到了两件事——宏和同源性。第一个毫无疑问是伟大的,第二个——不太多(就我的理解而言),因为它使人适合计算机的需要,而它应该是另一种方式

问题 同象性真的对人类(语言的最终用户)如此有益吗?或者它实际上几乎只对语言设计者有益?例子非常受欢迎

或者,以防我重新措辞——假设给定的语言有Lisp宏,“添加”同源性会提高最终用户的生产率吗?扩展性?还是完全相反

(*)我不能百分之百肯定,因为我只看到一小部分Clojure书籍,我不是在阅读它们,只是在评估它们的购买价值

更新
谢谢大家的回答,遗憾的是我只能选择一个作为解决方案:-),这并不意味着我对其他人的重视程度较低,这一个对我来说是最完整的。

不,创建一个强大的、类似Lisp的宏系统不一定需要同源性。同象性只是让这样的系统更容易使用;如果没有它,您将需要另一种语法来表示宏在计算时生成的AST。在同类语言中,宏系统感觉很自然,因为程序和元程序看起来是一样的。

想象一下,使用古老而笨拙的web模板语言方法,即使用
在python中使用嵌入式java

然后宏语言将是java,目标语言将是python。调用宏意味着跳出到
模式。您甚至可以设计这样一个系统来支持参数、字符串求值等等。这真的很难看(有点像旧的jsp或php代码)

一个可怕的想法:一些jsp用户会觉得这样的系统比lisp系统更舒服吗?如果宏/目标语言相同,这个怪物会得到改进吗

因此,这当然是可以做到的。人们用C++模板做了一些令人惊奇的事情。Jay Freeman编写了一个C++程序,用阿克曼编译时间和常数运行时间来证明C++模板可以做这样的事情(大概是因为斐波那契例子没有炸毁足够的编译器)。
至于同象性:它不能解决所有问题。即使使用它,也常常会有一些尴尬:引号、准引号等。您需要某种方式在“这是宏代码”和“这是目标语言代码”之间切换。这是语言设计者必须解决的一个固有问题。与将列表作为数据结构或程序代码的lispy语言不同,您可以考虑将字符串与eval方法一起使用的烦恼。程序源有点像字符串。字符串是一种非常糟糕的数据结构。而字符串中的字符串更糟糕。查找任何quine代码(非lisp)。他们可以被认为是同象似性犯了可怕的错误。

同象似性是一个定义不清的概念

Lisp的不同之处在于它有一个源代码的数据表示形式,而计算器将其作为输入。将源代码作为数据处理很容易,因为Lisp的所有常用功能都适用

它提供的内容:

  • 读取文本源并创建其数据结构
  • 将源代码作为数据进行处理
  • 将“源代码作为数据”打印为文本,包括漂亮的代码打印
宏是转换源代码的函数。因此,您所需要的只是源代码的一些表示和编程语言执行/编译/解释中的一个步骤,在这个转换步骤发生的地方

Lisp的工作方式使它更加方便,因为源代码是一种数据结构,可以使用多种内置函数和工具进行操作。请注意,更复杂的转换(需要理解Lisp语言的语法)在Lisp中也不容易实现,尽管已经实现了一些工具(例如所谓的代码漫游器)

还有一些Lisp的语法不是基于s表达式的。计算机代数系统REDUCE的实现语言RLISP就是一个例子。RLISP还支持宏

可以基于字符串和字符串操作定义类似的方案。还可以基于某种AST定义宏系统

使用su的语言示例
(defmacro for-loop [[sym init check change :as params] & steps]
 `(loop [~sym ~init value# nil]
    (if ~check
      (let [new-value# (do ~@steps)]
        (recur ~change new-value#))
      value#)))

;; Usage:
(for-loop [i 0 (< i 10) (inc i)] 
  (println i))
#load "pa_extend.cmo";

value gram = Grammar.gcreate (Plexer.gmake ());
value exp = Grammar.Entry.create gram "expression";

EXTEND
  exp:
  [ "SUM"
    [ x = exp; "+"; y = exp -> Op "+" x y
     | x = exp; "-"; y = exp -> Op "-" x y]
  | "PROD"
    [ x = exp; "*"; y = exp -> Op "*" x y
    | x = exp; "/"; y = exp -> Op "/" x y]
  | "ATOM"
    [ x = INT -> Int (int_of_string x)
    | x = LIDENT -> Var x
    | "("; x = exp; ")" -> x ] ]
  ;
END;
let rec search ?(x=0) ?(y=0) f accu = match x, y with
    9, y -> search ~x:0 ~y:(y+1) f accu (* Next row *)
  | 0, 9 -> f accu                      (* Found a solution *)
  | x, y ->
      if m.(y).[x] <> '0' then search ~x:(x+1) ~y f accu else
        fold (fun accu n ->
                let n = Char.chr (n + 48) in
                if invalid x y n then accu else
                  (m.(y).[x] <- n;
                   let accu = search ~x:(x+1) ~y f accu in
                   m.(y).[x] <- '0';
                   accu)) accu 1 10