Skip to content

Latest commit

 

History

History
166 lines (129 loc) · 4.11 KB

Kotlin gets support for S-expressions.md

File metadata and controls

166 lines (129 loc) · 4.11 KB
title date author tags keywords categories reward reward_title reward_wechat reward_alipay source_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 %}

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

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 </ strong> t P </ strong>加密,所以列表的文字非常重要:

{% 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 %}

试试看!

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

限制

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

{% raw %}

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

{% raw %}

{% endraw %}

点运算符

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