W języku Icon istnieją dwa rodzaje podprogramów:

  • funkcje,
  • procedury.

Choć nomenklatura podana wyżej jest zgodna ze stosowaną w innych językach programowania inaczej te pojęcia definiuje Icon.

  • Funkcją (w sensie języka Icon) nazywa się każdy standardowy podprogram, wbudowany w język i dostarczany przez implementację.
  • Procedurą (w sensie języka Icon) nazywa się każdy podprogram deklarowany w kodzie źródłowym przez programistę, bez względu na to, czy
    • podprogram ma charakter funkcyjny, tzn. zwraca określoną wartość w miejsce wywołania podprogramu, czy też
    • podprogram ma charakter proceduralny, tzn. jest blokiem, który nie zwraca żadnej wartości.

Identyfikatory, określające zarówno procedury jak i funkcje, należą do wspólnego typu proceduralnego (procedure).

Wywołanie podprogramu może nastąpić:

  • samodzielnie, poprzez nazwę z ewentualną listą argumentów, np. write("Hello world!"),
  • w wyrażeniu, poprzez nazwę z ewentualną listą argumentów, przy czym ten sposób wywołania może dotyczyć na ogół tylko tych funkcji i procedur, które zwracają wartość.

W powyższym stwierdzeniu (że podprogramy wywoływane w wyrażeniu powinny zwracać wartość), użyto ogranicznika "na ogół", gdyż specyfika Iconu, w którym wyrażenie może generować sukces lub niepowodzenie, powoduje, że istnieją konteksty w których wyrażenie może zawierać wywołanie podprogramu nie zwracającego wartości. Ponieważ samo wywołanie podprogramu jest również wyrażeniem (samodzielnym, lub stanowiącym część innego wyrażenia), w wyrażeniach warunkowych i decyzyjnych takie wywołanie jest dopuszczalne, wręcz często stosowane jako konstrukcja typowa dla Iconu. Przykładem może być np. zastosowanie funkcji write w wyrażeniu warunkowym if, w którym instrukcje są wykonywane tylko, jeżeli zapis do pliku F powiedzie się:

 if write(F,text) then { instrukcje }

Ogólna postać deklaracji procedury na postać:

 procedure identyfikator([lista_paramertów])
   [deklaracje_lokalne]
   [sekcja_initial]
   [treść_procedury]
 end

przy czym elementy ujęte w nawiasy kwadratowe są opcjonalne (mogą być puste).

  • Słowo zastrzeżone procedure identyfikuje początek deklaracji procedury i jest obowiązkowe.
  • Identyfikator jest również elementem obowiązkowym deklaracji procedury i powinien być tworzony wg zasad podanych w rozdziale "Kod źródłowy", identyfikator procedury jest globalny w programie.
  • Lista_prarametrów jest elementem opcjonalnym i służy do przekazywania do podprogramu wartości. W Iconie wszystkie argumenty są przekazywane przez wartość. Należy jednak pamiętać, że wartościami pewnych identyfikatorów, np. tablic są tylko wskaźniki, a więc przekazaniu przez wartość podlega wskaźnik to tablicy – nie jest tworzona kopia i obliczenia są wykonywane bezpośrednio na danym elemencie, tzn. uzyskuje się efekt taki jak przy przekazywaniu przez zmienną. Lista parametrów tworzy się rozdzielając przecinkami poszczególne identyfikatory. Nie istnieje specyfikacja typu, typ przekazywanego argumentu może być dowolny. Identyfikator zamieszczony na liście parametrów zachowuje się w treści procedury ja identyfikator lokalny.
  • Deklaracje_lokalne to również opcjonalny element deklaracji podprogramu. W tej sekcji można umieszczać deklaracje lokalnych identyfikatorów, lecz nie jest to wymagane, natomiast wymagane jest deklarowanie identyfikatorów statycznych. Postać deklaracji lokalnych:
 local lista_identyfikatorów

oraz postać deklaracji statycznych:

 static lista_identyfikatorów
  • Sekcja_initial związana jest deklaracjami identyfikatorów statycznych i ma postać:
 initial wyrażenie

przy czym wyrażenie może być proste (jak wyżej) lub złożone i wtedy postać tej sekcji wygląda następująco:

 initial { wyrażenia }
  • Treść_procedury to właściwa definicja czynności do wykonania – algorytmu – budowana z wyrażeń języka Icon.
  • Słowo zastrzeżone end identyfikuje koniec deklaracji procedury i jest obowiązkowe.