Skip to content

Commit

Permalink
Improve documentation around func and method (nim-lang#19207)
Browse files Browse the repository at this point in the history
* Improve documentation around func and method

* Update doc/tut1.rst

Co-authored-by: Danil Yarantsev <[email protected]>

* Update doc/tut1.rst

Co-authored-by: Danil Yarantsev <[email protected]>

* Update doc/tut1.rst

Co-authored-by: konsumlamm <[email protected]>

* Update doc/tut1.rst

Co-authored-by: konsumlamm <[email protected]>

* Update doc/tut1.rst

Co-authored-by: konsumlamm <[email protected]>

* Update doc/tut1.rst

Co-authored-by: konsumlamm <[email protected]>

* Update doc/tut1.rst

Co-authored-by: konsumlamm <[email protected]>

* Update doc/tut1.rst

Co-authored-by: konsumlamm <[email protected]>

* Update doc/tut1.rst

Co-authored-by: Zoom <[email protected]>

* Update doc/tut1.rst

Co-authored-by: Zoom <[email protected]>

* Update doc/tut1.rst

Co-authored-by: Zoom <[email protected]>

* Update doc/tut1.rst

Co-authored-by: Zoom <[email protected]>

* Rewrite of Zooms suggestion

* Update doc/tut1.rst

Co-authored-by: konsumlamm <[email protected]>

Co-authored-by: Danil Yarantsev <[email protected]>
Co-authored-by: konsumlamm <[email protected]>
Co-authored-by: Zoom <[email protected]>
  • Loading branch information
4 people committed Mar 28, 2022
1 parent 2833d68 commit 43d1eaa
Showing 1 changed file with 29 additions and 2 deletions.
31 changes: 29 additions & 2 deletions doc/tut1.rst
Original file line number Diff line number Diff line change
Expand Up @@ -595,8 +595,10 @@ Procedures

To define new commands like `echo <system.html#echo,varargs[typed,]>`_
and `readLine <io.html#readLine,File>`_ in the examples, the concept of a
*procedure* is needed. (Some languages call them *methods* or *functions*.)
In Nim new procedures are defined with the `proc` keyword:
*procedure* is needed. You might be used to them being called *methods* or
*functions* in other languages, but Nim
`differentiates these concepts <tut1.html#procedures-funcs-and-methods>`_. In
Nim, new procedures are defined with the `proc` keyword:

.. code-block:: nim
:test: "nim c $1"
Expand Down Expand Up @@ -874,6 +876,31 @@ The example also shows that a proc's body can consist of a single expression
whose value is then returned implicitly.


Funcs and methods
-----------------

As mentioned in the introduction, Nim differentiates between procedures,
functions, and methods, defined by the `proc`, `func`, and `method` keywords
respectively. In some ways, Nim is a bit more pedantic in its definitions than
other languages.

Functions are closer to the concept of a pure mathematical
function, which might be familiar to you if you've ever done functional
programming. Essentially they are procedures with additional limitations set on
them: they can't access global state (except `const`) and can't produce
side-effects. The `func` keyword is basically an alias for `proc` tagged
with `{.noSideEffects.}`. Functions can still change their mutable arguments
however, which are those marked as `var`, along with any `ref` objects.

Unlike procedures, methods are dynamically dispatched. This sounds a bit
complicated, but it is a concept closely related to inheritance and object oriented
programming. If you overload a procedure (two procedures with the same name but
of different types or with different sets of arguments are said to be overloaded), the procedure to use is determined
at compile-time. Methods, on the other hand, depend on objects that inherit from
the `RootObj`. This is something that is covered in much greater depth in
the `second part of the tutorial<tut2.html#object-oriented-programming-dynamic-dispatch>`_.


Iterators
=========

Expand Down

0 comments on commit 43d1eaa

Please sign in to comment.