0
  • I am just getting curious about lisp programming and wanted to know how to use concurrent lisp by making threads.

    -I also wanted to be clear with the pcall() function in lisp.

Joshua Taylor
  • 84,998
  • 9
  • 154
  • 353
Omkar
  • 791
  • 1
  • 9
  • 26
  • Can you be more specific about which lisp and libraries you are using, and what is unclear to you? – Samuel Edwin Ward Jan 27 '15 at 21:50
  • @samuel-edwin-ward am using the sbcl lisp on fedora 19.I was reading the threading part in the sbcl manual,and just wanted a simple program that would illustrate the use of threading in it.Also i noticed the ex in which pcall was used to automatically perform the operation concurrently.Ex (pcall (+(* a b) (*c d)) – Omkar Jan 28 '15 at 15:32
  • This is almost certainly off topic (too broad, not enough detail, etc.), but you may find [Eager-Future2 Library :Parallel Programming in Lisp](http://stackoverflow.com/q/27798351/1281433) helpful, at least in terms of links to follow. – Joshua Taylor Jan 29 '15 at 20:48
  • Ok that definately helped me.Thank You Joshua Taylor – Omkar Jan 30 '15 at 15:31

1 Answers1

2

the comments to your question give you the right key to solve the problem. I hope this is still helpful.

If you want to use concurrency with common lisp, One of the ways is Eager Future2 http://common-lisp.net/project/eager-future/, but you can choose other models here http://www.cliki.net/concurrency.

Eager Future is based, like the name suggested, in Futures

"Eager Future2 is a Common Lisp library that provides composable concurrency primitives that unify parallel and lazy evaluation, are integrated with CL's condition system, and have automatic resource management. The basic unit of concurrency in Eager Future2 is the future, which is a data type that acts as a proxy for the values of a no-argument function (thunk) that is computed concurrently."

Let's see how works pcall, from documentation of Eager Furture2 we find:

" function pcall (thunk &optional (future-type default-future-type)) => future Given a function of no arguments, returns an object (called a future) that can later be used to retrieve the values computed by the function. future-type (by default the value of default-future-type) can either be :eager, :speculative, or :lazy. See the documentation of default-future-type for an explanation of the different future types. The function is called in an unspecified dynamic environment."

sample lisp code

;; use quicklisp to add Eager-Future2 to your common lisp
;; implementation in my case I use GVIM, SLIMV and SBCL
(quicklisp:quickload "EAGER-FUTURE2")

(defparameter *future* (eager-future2:pcall #'compute))

*future*

;; Returns non nil if the future values have been computed, nil otherwise
(eager-future2:ready-to-yield? *future*)

;;Returns the computed values, see delayed future, computes the value in current thread, 
;;and speculative future computes the future in a current thread if not is evalatuated 
;;in another thread. 
(eager-future2:yield *future*)




;; function for the long computation, from http://www.cliki.net/fibonacci
(defun fib (n) 
  "Tail-recursive computation of the nth element of the Fibonacci sequence" 
  (check-type n (integer 0 *)) 
  (labels ((fib-aux (n f1 f2) 
             (if (zerop n) 
               f1 (fib-aux (1- n) f2 (+ f1 f2))))) 
    (fib-aux n 0 1)))

;; function with no arguments for pcall that computes fibonacci 10000th number
(defun compute () 
  (fib 10000))

Use in REPL

SBCL 1.2.4-1.fc21  Port: 4005  Pid: 1188
; SWANK 2014-10-10
CL-USER> (quicklisp:quickload "EAGER-FUTURE2")
To load "eager-future2":
  Load 1 ASDF system:
    alexandria
  Install 3 Quicklisp releases:
    bordeaux-threads eager-future2 trivial-garbage
; Fetching #<URL "http://beta.quicklisp.org/archive/trivial-garbage/2013-03-12/trivial-garbage-20130312-git.tgz">
; 8.00KB
==================================================
8,197 bytes in 0.01 seconds (1143.55KB/sec)
; Fetching #<URL "http://beta.quicklisp.org/archive/bordeaux-threads/2013-06-15/bordeaux-threads-0.8.3.tgz">
; 18.31KB
==================================================
18,754 bytes in 0.06 seconds (327.04KB/sec)
; Fetching #<URL "http://beta.quicklisp.org/archive/eager-future2/2011-03-20/eager-future2-0.2.tgz">
; 17.34KB
==================================================
17,758 bytes in 0.07 seconds (262.75KB/sec)
; Loading "eager-future2"
[package bordeaux-threads]........................
[package trivial-garbage].........................
[package eager-future2]..
("EAGER-FUTURE2")
CL-USER> (defun fib (n) 
  "Tail-recursive computation of the nth element of the Fibonacci sequence" 
  (check-type n (integer 0 *)) 
  (labels ((fib-aux (n f1 f2)  ...))))
FIB
CL-USER> (fib 1000)
43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
CL-USER> (fib 10000)
33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812206564914032751086643394517512161526545361333111314042436854805106765843493523836959653428071768775328348234345557366719731392746273629108210679280784718035329131176778924659089938635459327894523777674406192240337638674004021330343297496902028328145933418826817683893072003634795623117103101291953169794607632737589253530772552375943788434504067715555779056450443016640119462580972216729758615026968443146952034614932291105970676243268515992834709891284706740862008587135016260312071903172086094081298321581077282076353186624611278245537208532365305775956430072517744315051539600905168603220349163222640885248852433158051534849622434848299380905070483482449327453732624567755879089187190803662058009594743150052402532709746995318770724376825907419939632265984147498193609285223945039707165443156421328157688908058783183404917434556270520223564846495196112460268313970975069382648706613264507665074611512677522748621598642530711298441182622661057163515069260029861704945425047491378115154139941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875
CL-USER> (defun compute () 
  (fib 10000))
COMPUTE
CL-USER> (defparameter *future* (eager-future2:pcall #'compute))
*FUTURE*
CL-USER> *future*
#<EAGER-FUTURE2:FUTURE {1004F20383}>
CL-USER> (eager-future2:ready-to-yield? *future*)
T
CL-USER> (eager-future2:yield *future*)
33644764876431783266621612005107543310302148460680063906564769974680081442166662368155595513633734025582065332680836159373734790483865268263040892463056431887354544369559827491606602099884183933864652731300088830269235673613135117579297437854413752130520504347701602264758318906527890855154366159582987279682987510631200575428783453215515103870818298969791613127856265033195487140214287532698187962046936097879900350962302291026368131493195275630227837628441540360584402572114334961180023091208287046088923962328835461505776583271252546093591128203925285393434620904245248929403901706233888991085841065183173360437470737908552631764325733993712871937587746897479926305837065742830161637408969178426378624212835258112820516370298089332099905707920064367426202389783111470054074998459250360633560933883831923386783056136435351892133279732908133732642652633989763922723407882928177953580570993691049175470808931841056146322338217465637321248226383092103297701648054726243842374862411453093812206564914032751086643394517512161526545361333111314042436854805106765843493523836959653428071768775328348234345557366719731392746273629108210679280784718035329131176778924659089938635459327894523777674406192240337638674004021330343297496902028328145933418826817683893072003634795623117103101291953169794607632737589253530772552375943788434504067715555779056450443016640119462580972216729758615026968443146952034614932291105970676243268515992834709891284706740862008587135016260312071903172086094081298321581077282076353186624611278245537208532365305775956430072517744315051539600905168603220349163222640885248852433158051534849622434848299380905070483482449327453732624567755879089187190803662058009594743150052402532709746995318770724376825907419939632265984147498193609285223945039707165443156421328157688908058783183404917434556270520223564846495196112460268313970975069382648706613264507665074611512677522748621598642530711298441182622661057163515069260029861704945425047491378115154139941550671256271197133252763631939606902895650288268608362241082050562430701794976171121233066073310059947366875
CL-USER> 

I hope that this will be usefull

anquegi
  • 11,125
  • 4
  • 51
  • 67