\input texinfo @settitle Concise Common Workflow Language @copying Copyright @copyright{} 2021 Arun Isaac@* Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled ``GNU Free Documentation License''. @end copying @ifnottex @node Top @top Concise Common Workflow Language @end ifnottex This manual documents the development version of @abbr{ccwl, Concise Common Workflow Language}, a concise syntax to express @abbr{CWL, Common Workflow Language} workflows. @menu * Introduction:: What is ccwl? * Tutorial:: A quick tutorial to get started with ccwl * Contributing:: Contributing @end menu @node Introduction @chapter Introduction @abbr{CWL, Common Workflow Language} is an open standard for describing analysis workflows and tools in a way that makes them portable and scalable across a variety of software and hardware environments. @abbr{ccwl, Concise Common Workflow Language} is a concise syntax to express CWL workflows. It is implemented as an @abbr{EDSL, Embedded Domain Specific Language} in the Scheme programming language, a minimalist dialect of the Lisp family of programming languages. ccwl is a compiler to generate CWL workflows from concise descriptions in ccwl. In the future, ccwl will also have a runtime whereby users can interactively execute workflows while developing them. @node Tutorial @chapter Tutorial This tutorial will introduce you to writing workflows in ccwl. Some knowledge of CWL is assumed. To learn about CWL, please see the @url{https://www.commonwl.org/user_guide/, Common Workflow Language User Guide}. @menu * Important concepts:: Static typing, multiple named inputs and outputs @end menu @node Important concepts @section The CWL and ccwl workflow languages The CWL and ccwl workflow languages are statically typed programming languages where functions accept multiple named inputs and return multiple named outputs. Let's break down what that means. @subsection Static typing In CWL, the type of arguments accepted by a function and the type of outputs returned by that function are specified explicitly by the programmer, and are known at compile time even before the code has been run. Hence, we say that it is statically typed. @subsection Positional arguments and named arguments In many languages, the order of arguments passed to a function is significant. The position of each argument determines which formal argument it gets mapped to. For example, passing positional arguments in Scheme looks like @lisp (foo 1 2) @end lisp In a language that supports named arguments, the order of arguments is not significant. Each argument explicitly names the formal argument it gets mapped to. For example, in Scheme, passing named arguments may look like @lisp (foo #:bar 1 #:baz 2) @end lisp @subsection Multiple function arguments and return values In most languages, functions accept multiple input arguments but only return a single output value. However, in CWL, a function can return multiple output values as well. These multiple outputs are unordered and are each addressed by a unique name. @node Contributing @chapter Contributing ccwl is developed on GitHub at @url{https://github.com/arunisaac/ccwl}. Feedback, suggestions, feature requests, bug reports and pull requests are all welcome. Unclear and unspecific error messages are considered a bug. Do report them! @bye