美文网首页
clojure java 交互 语法糖 展开点

clojure java 交互 语法糖 展开点

作者: onedam | 来源:发表于2022-04-13 12:21 被阅读0次
public static Object macroexpand1(Object x) {
        if (x instanceof ISeq) {
            ISeq form = (ISeq)x;
            Object op = RT.first(form);
            if (isSpecial(op)) {
                return x;
            }

            Var v = isMacro(op);
            if (v != null) {
                ISeq args = RT.cons(form, RT.cons(LOCAL_ENV.get(), form.next()));
                return v.applyTo(args);
            }

 // 这里如果是 java.util.Date/pares 等形式. 则变(展开)成 new 或  dot(.) special form 
            if (op instanceof Symbol) { 
                Symbol sym = (Symbol)op;
                String sname = sym.name;
                Symbol target;
                if (sym.name.charAt(0) == '.') {
                    if (RT.length(form) < 2) {
                        throw new IllegalArgumentException("Malformed member expression, expecting (.member target ...)");
                    }

                    target = Symbol.intern(sname.substring(1));
                    Object target = RT.second(form);
                    if (Compiler.HostExpr.maybeClass(target, false) != null) {
                        target = ((IObj)RT.list(IDENTITY, target)).withMeta(RT.map(new Object[]{RT.TAG_KEY, CLASS}));
                    }

                    return preserveTag(form, RT.listStar(DOT, target, target, form.next().next()));
                }

                if (namesStaticMember(sym)) {
                    target = Symbol.intern(sym.ns);
                    Class c = Compiler.HostExpr.maybeClass(target, false);
                    if (c != null) {
                        Symbol meth = Symbol.intern(sym.name);
                        return preserveTag(form, RT.listStar(DOT, target, meth, form.next()));
                    }
                } else {
                    int idx = sname.lastIndexOf(46);
                    if (idx == sname.length() - 1) {
                        return RT.listStar(NEW, Symbol.intern(sname.substring(0, idx)), form.next());
                    }
                }
            }
        }

        return x;
    }

相关文章

  • clojure java 交互 语法糖 展开点

  • Clojure 脚本

    Clojure 语法 https://www.w3cschool.cn/clojure/clojure_basic...

  • 关于语法糖的一些粗鄙之见

    ABCDEFGZ A丨思维逻辑 糖 --> 语法糖 --> 衍生词语 --> java 中的语法糖 --> ...

  • 快速上⼿ Kotlin

    快速上⼿ Kotlin 基础语法 函数基础语法 与 Java 代码互调 Java 与 Kotlin 交互的语法变化...

  • Java语法糖汇总解析

    Java语法糖: 语法糖(Syntactic Sugar),也称糖衣语法,指在计算机语言中添加的某种语法,这种语法...

  • Java语法糖(1):可变长度参数以及foreach循环原理

    语法糖 接下来几篇文章要开启一个Java语法糖系列,所以首先讲讲什么是语法糖。语法糖是一种几乎每种语言或多或少都提...

  • Java中泛型和通配符

    Java中泛型:java语法糖: 语法糖的是一个专业术语,指的是计算机语言中的某一种语法,这个种语法并不会影响语言...

  • Clojure语法

    字面量 数字类型 42 ; 长整型,64位,范围 -2^63 to 2^63-1 6.022e23 ; ...

  • Java语法糖

    语法糖(Syntactic Sugar),也称糖衣语法 指在计算机语言中添加的某种语法,这种语法对语言本身功能来说...

  • Java 语法糖

    前言 Java 最早诞生于 1995 年,直到现在都还是最热门的语言之一,那么Java 是怎么满足人们提出的各种后...

网友评论

      本文标题:clojure java 交互 语法糖 展开点

      本文链接:https://www.haomeiwen.com/subject/amqasrtx.html