LispEx, 在围棋中,Lisp的方言扩展为支持并发编程,编写

分享于 

6分钟阅读

GitHub

  繁體 雙語
A dialect of Lisp extended to support for concurrent programming, written in Go.
  • 源代码名称:LispEx
  • 源代码网址:http://www.github.com/kedebug/LispEx
  • LispEx源代码文档
  • LispEx源代码下载
  • Git URL:
    git://www.github.com/kedebug/LispEx.git
    Git Clone代码到本地:
    git clone http://www.github.com/kedebug/LispEx
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/kedebug/LispEx
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    LispEx Build Status

    一种支持并发编程的Lisp方言。

    概述

    LispEx是另一个基于java的Lisp解释器,它是用 实现的。 语法,语义和库过程是 R5RS的子集:

    LispEx 0.1.0 (Saturday, 19-Jul-14 12:52:45 CST);; lambda expression>>> ((lambda (x y. z) (+ x y (car z))) 12511)
    8;; currying>>> (define (curry func arg1) (lambda (arg) (apply func arg1 (list arg))))
    >>> (map (curry +2) '(1234))
    (3456);; apply>>> (apply+12'(34))
    10;; composite function>>> (define ((compose f g) x) (f (g x)))
    >>> (definecaar (compose car car))
    >>> (caar'((12) 34))
    1;; tail recursion >>> (letrec 
     ((even? (lambda (n) (if (=0 n) #t (odd? (- n 1)))))
     (odd? (lambda (n) (if (=0 n) #f (even? (- n 1))))))
     (even?88))
    #t;; multiple nestings of quasiquote ;; (challenging to have a right implementation)>>> `(1 `,(+1, (+23)) 4)
    (1 `,(+15) 4)
    >>> `(1 ```,,@,,@(list (+12)) 4)
    (1 ```,,@,3 4);; lazy evaluation>>> (definef (delay (+1)))
    >>> (force f)
    1

    什么是新的, go并发特性are在LispEx中引入。 你可以使用 go 语句启动新的协同程序,并使用 <-chan 或者 chan<- 连接它们。 下面是一个 ping-pong示例:

    ; define channels(defineping-chan (make-chan))
    (definepong-chan (make-chan)); define a buffered channel(definesem (make-chan 2))
    (define (ping n)
     (if (> n 0)
     (begin (display (<-chan ping-chan))
     (newline)
     (chan<- pong-chan 'pong)
     (ping (- n 1)))
     (chan<- sem 'exit-ping)))
    (define (pong n)
     (if (> n 0)
     (begin (chan<- ping-chan 'ping)
     (display (<-chan pong-chan))
     (newline)
     (pong (- n 1)))
     (chan<- sem 'exit-pong)))
    (go (ping 6)) ; start ping-routine(go (pong 6)) ; start pong-routine; implement semaphore with channel, waiting for ping-pong finishing(<-chan sem) (newline)
    (<-chan sem) (newline); should close channels if you don't need it(close-chan sem)
    (close-chan pong-chan)
    (close-chan ping-chan); the output will be: ping pong ping pong.. . exit-ping exit-pong

    此外,还支持 select 语句,在多个使用并发例程的通道之间进行选择是必需的。 就像 go一样,代码可以像这样编写:

    (definechan-1 (make-chan))
    (definechan-2 (make-chan))
    (go (chan<- chan-1 'hello-chan-1))
    (go (chan<- chan-2 'hello-chan-2))
    (select
     ((<-chan chan-1))
     ((<-chan chan-2))
     (default 'hello-default))
    (close-chan chan-1)
    (close-chan chan-2); the output will be: hello-default, as it will cost some CPU times when a coroutine is lanuched.

    在这种情况下,选择 default 例子,因为当 select 语句的语句是intepretered时,chan-1 或者 chan-2 中。 但是,如果我们将主线程设置为一段时间,那么这种情况将会发生改变:

    (definechan-1 (make-chan))
    (definechan-2 (make-chan))
    (go (chan<- chan-1 'hello-chan-1))
    (go (chan<- chan-2 'hello-chan-2)); sleep for 20 millisecond(sleep 20)
    (select
     ((<-chan chan-1))
     ((<-chan chan-2))
     (default 'hello-default))
    (close-chan chan-1)
    (close-chan chan-2); the output will be randomized: hello-chan-1 or hello-chan-2

    有关更多兴趣示例,请参见测试插件文件夹下的文件。

    特性

    • 简洁的设计代码,很容易理解的原则,灵感来自
    • 同时设计的词汇扫描,灵感来自 Rob
    • 内置程序,通道和其他必要的并发编程组件
    • 给你一个替代

    开发中的插件

    • R5RS中的loop
    • 尾部呼叫优化
    • 类型检查器

    有一个尝试

    
    git clone https://github.com/kedebug/LispEx.git
    
    
    cd LispEx
    
    
    go build &&./LispEx
    
    
    LispEx 0.1.0 (Saturday, 19-Jul-14 12:52:45 CST)
    
    
    >>> 
    
    
    
    

    从这里你可以输入表单,你将得到被计算的表达式。 解释 file:

    
    ./LispEx filename.ss
    
    
    
    

    Lisp很有趣,围棋好玩,并发有趣。 希望你对LispEx有一个非凡的编程体验。

    许可证

    MIT


    ext  SUP  lis  Extend  DIA  LISP  
    相关文章