Erlang Central

LFE gen server Example

Revision as of 19:09, 10 January 2009 by Giara (Talk | contribs)


Lisp Flavored Erlang: gen_server Example

This is a very simple gen_server example. It implements a locally registered server which keeps an integer as state and can return the current integer or the next one (in which case the state will increment).


  • Save the code to count_server.lfe
  • Compile it from the Erlang shell with lfe_comp:file(count_server).

Using From the Erlang Shell

Since LFE modules are just like normal modules, you use them the same way:

  • Load the new module with l(count_server).
  • Start up the server with count_server:start_link().
  • Send it commands like count_server:current(). or count_server:next().

Using From the LFE Shell



;; count_server.lfe
;; Simple gen_server example. 

(defmodule count_server
  (behavior 'gen_server)

  ;; gen_server exports
   (init 1)
   (handle_call 3)
   (handle_cast 2)
   (handle_info 2)
   (terminate 2)
   (code_change 3))

  ;; public functions
   (start_link 0)
   (current 0)
   (next 0)))

;; gen_server implementation

(defun init (args)
  #(ok 0))

(defun handle_call 
  (('next _ n)
   (let ((new (+ n 1)))
     (tuple 'reply (tuple 'ok new) new)))
  (('current _ n)
   (tuple 'reply (tuple 'ok n) n))) 

(defun handle_cast (req state)
  (tuple 'stop #(error not_implemented) state))

(defun handle_info (info state)
  (tuple 'stop #(error not_implemented) state))

(defun terminate (reason state)

(defun code_change (oldvsn state extra)
  (tuple 'ok state))

;; public functions

(defun start_link ()
  (: gen_server start_link #(local count_server) 'count_server () ())) 

(defun current ()
  (: gen_server call 'count_server 'current))

(defun next ()
  (: gen_server call 'count_server 'next))