Сессионный протокол FRP (File Retrieval Protocol)

Пример определения протокола с помощью предметно-ориентированного языка Etiqutte.

(defprotocol frp ()
  (while-phase proceed (proceed-p :from :initiator)	; iteration over frp-body
    (:sub frp-body)					; until client decides to terminate
    (:sub bye)))

(defprotocol frp-body (frp)
  (case-phase request (command-sel :from :initiator :converter 'to-line)
    (GET (:sub frp-get))				; GET file
    (PUT (:sub frp-put))				; PUT file
    (CD  (:sub frp-cd))					; CD directory
    (BYE (:sub bye))))					; BYE Goodbye

(defprotocol frp-get (frp)
  (phase query (:from :initiator :converter 'to-line)	; gets the line from parent
    (GET query))					; GET is command, query is action
  (if-phase granted (granted-p :from :respondent)
    (:sub frp-get-transfer)
    ACCESS-DENIED))

(defprotocol frp-get-transfer ()
  (phase size (:from :initiator :converter 'to-object)	; SIZE bytecount
    (SIZE transfer-size))				; server passes the size at once
  (if-phase confirm (confirm-p :from :respondent)	; wait for confirmation from client
    (CONFIRM confirm-transfer)
    FINISH)
  (phase data (:from :initiator)			; (function ...) syntax for action
    (DATA transfer-data)))				; server is sending data

(defprotocol frp-put ()
  (phase query (:from :initiator :converter 'to-line)	; gets the line from parent
    (PUT query))					; PUT is command, query is action
  (if-phase granted (granted-p :from :respondent)
    (:sub frp-put-transfer)
    ACCESS-DENIED))

(defprotocol frp-put-transfer ()
 ;;; Server is initiator and has confirmed receiving
  (phase confirm (:from :initiator)			; pass the confirmation
    (CONFIRM confirm-transfer))				; CONFIRM
  (phase size (:from :respondent :converter 'to-object)	; SIZE bytecount
    (SIZE transfer-size))				; client passes the size
  (phase data (:from :respondent)			; DATA
    (DATA transfer-data)))				; client is sending data

(defprotocol frp-cd ()
  (phase query (:from :initiator :converter 'to-line)	; gets the line from parent
    (CD query))						; CD is command, query is action
  (if-phase granted (granted-p :from :respondent)
    (CONFIRM confirm-cd)				; CONFIRM
    ACCESS-DENIED))

(defprotocol bye ()
  (phase bye (:from :initiator :to :respondent)
    BYE)
  (terminate))