Skip to content
This repository has been archived by the owner on Apr 13, 2023. It is now read-only.

Latest commit

 

History

History
168 lines (131 loc) · 4.12 KB

Kotlin gets support for S-expressions.md

File metadata and controls

168 lines (131 loc) · 4.12 KB
title date author tags keywords categories reward reward_title reward_wechat reward_alipay source_url translator translator_url
[译]Kotlin gets support for S-expressions
2014-04-01 11:33:00 -0700
Andrey Breslav
官方动态
false
Have a nice Kotlin!

Kotlin 总是乐意从其他编程语言中学习,这就是为什么我们决定支持 S 表达式 ,赋权的概念 LISP 。 其背后的主要动机是兼容性 Clojure ,JVM 的 LISP。 Clojure 以其实体库而闻名,特别是用于并发和只读数据结构的库。 为了促进与 LISP(和 Clo 尤其是图书馆)的互操作性,Kotlin 现在允许这样的表达式:

{% raw %}

{% endraw %}
(println (
        (lambda (arg1)
            (+
                "first lambda: "
                arg1
                (lambda (arg2)
                    (+ "second lambda: " arg1 arg2)
                )
            )
        ) foo "bar"
    ))

{% raw %}

{% endraw %}

这只是给你的味道。现在,我们逐一解释这些结构。

S 表达式解释

首先,只添加一个新的句法结构,即 S 表达式。它有形式

{% raw %}

{% endraw %}
(A B C ...)

{% raw %}

{% endraw %}

其中 A,B,C ...可能自己是 S 表达式或其他 Kotlin 表达式。 现在,LISP 中的大多数操作都是以前缀形式编写的,如果需要,您可以在 Kotlin 中以此样式写入添加:

{% raw %}

{% endraw %}
(+ 1 two 3)

{% raw %}

{% endraw %}

请注意,文字('1','3')可以与其他表达式(例如“两”)混合。 LISP 原来代表LIS t P加密,所以列表的文字非常重要:

{% raw %}

{% endraw %}
(list abc "def" ghi "jkl")

{% raw %}

{% endraw %}

这将创建一个四个对象的列表。 正常的 Kotlin 函数可以以 LISP 方式调用,因此要打印上面的列表,我们可以说:

{% raw %}

{% endraw %}
  (println
       (list abc "def" ghi "jkl")
  )

{% raw %}

{% endraw %}

Lambda 表达式还具有 LISP 格式:

{% raw %}

{% endraw %}
(lambda (arg1) (+ 1 arg1 2))

{% raw %}

{% endraw %}

以下代码演示了闭包:

{% raw %}

{% endraw %}
    (println (
        (lambda (arg1)
            (+
                "first lambda: "
                arg1
                (lambda (arg2)
                    (+ "second lambda: " arg1 arg2)
                )
            )
        ) foo "bar"
    ))

{% raw %}

{% endraw %}

试试看!

你可以找到上面的例子(还有一些) 这里 。他们是可运行的,你可以玩代码。 免责声明:它只是一个原型。

限制

不幸的是,在这个阶段我们对 S 表达式的支持有限。由于与解析相关的一些问题,S 表达式只能是奇数长度。我们正在努力消除这个限制。 另外,当将命名函数定义为 S 表达式时,其名称必须在前面带有一个点(不要与下面提到的点运算符混淆):

{% raw %}

{% endraw %}
(defun .baz (a, b, c) (+ a b c))<span style="font-size: 16px;"> 
</span>

{% raw %}

{% endraw %}

点运算符

你们中的许多人正在急切地等待我们释放 点运算符 。现在它的实现,编译器和 IDE 插件可以下载 这里 , 谢谢 jgl87