|
1 | 1 | window.__HL_SECTIONS = window.__HL_SECTIONS || {}; |
2 | 2 | window.__HL_SECTIONS['sterowanie'] = ` |
3 | | -<!-- ─ IF / ELSIF / ELSE ──────────────────────────────────────────────────── --> |
4 | 3 | <div class="section" id="if"> |
5 | 4 | <div class="sec-header"><span class="sec-num">07</span><h2>If / Elsif / Else</h2></div> |
6 | | -<p>Warunki w H# używają słów kluczowych <code>if</code>, <code>elsif</code>, <code>else</code> z ciałem <code>do...end</code> lub opcjonalnym <code>then do...end</code>. Warunek to dowolne wyrażenie bool.</p> |
7 | | -<table class="ref-table"> |
8 | | -<tr><th>Składnia</th><th>Opis</th></tr> |
9 | | -<tr><td><span class="td-syntax">if cond do...end</span></td><td class="td-desc">Podstawowy warunek</td></tr> |
10 | | -<tr><td><span class="td-syntax">elsif cond do...end</span></td><td class="td-desc">Dodatkowa gałąź (analogicznie <code>elif</code> w Python)</td></tr> |
11 | | -<tr><td><span class="td-syntax">else do...end</span></td><td class="td-desc">Gałąź domyślna</td></tr> |
12 | | -<tr><td><span class="td-syntax">if cond then do...end</span></td><td class="td-desc">Wariant z opcjonalnym <code>then</code> przed <code>do</code></td></tr> |
13 | | -</table> |
| 5 | +<p>Warunek zapisuje się jako <code>if warunek is...end</code>. Blok zaczyna się słowem <code>is</code>, a kończy <code>end</code>.</p> |
14 | 6 | <div class="code-block"> |
15 | | -<div class="code-header"><span class="code-filename">warunki.h#</span><button class="copy-btn">Copy</button></div> |
16 | | -<div class="code-body"><div class="line-nums"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span><span>13</span><span>14</span><span>15</span><span>16</span><span>17</span><span>18</span><span>19</span><span>20</span><span>21</span><span>22</span><span>23</span><span>24</span><span>25</span><span>26</span><span>27</span><span>28</span><span>29</span></div> |
17 | | -<div class="code-inner"><pre><span class="t-kw">let</span> cpu: int = <span class="t-num">75</span> |
18 | | -<span class="t-kw">let</span> port: int = <span class="t-num">8080</span> |
| 7 | +<div class="code-header"><span class="code-filename">if.h#</span><button class="copy-btn">Copy</button></div> |
| 8 | +<div class="code-body"><div class="code-inner"><pre><span class="t-kw">fn</span> <span class="t-func">main</span>() <span class="t-kw">is</span> |
| 9 | + <span class="t-kw">let</span> port: int = <span class="t-num">443</span> |
19 | 10 |
|
20 | | -<span class="t-comment"># ── Podstawowy if ─────────────────────────────────</span> |
21 | | -<span class="t-kw">if</span> cpu > <span class="t-num">90</span> <span class="t-kw">do</span> |
22 | | -println(<span class="t-str">"KRYTYCZNE! CPU="</span> + to_string(cpu) + <span class="t-str">"%"</span>) |
23 | | -<span class="t-kw">end</span> |
24 | | -
|
25 | | -<span class="t-comment"># ── Łańcuch if / elsif / else ─────────────────────</span> |
26 | | -<span class="t-kw">if</span> cpu > <span class="t-num">90</span> <span class="t-kw">do</span> |
27 | | -println(<span class="t-str">"KRYTYCZNY"</span>) |
28 | | -<span class="t-kw">elsif</span> cpu > <span class="t-num">70</span> <span class="t-kw">do</span> |
29 | | -println(<span class="t-str">"Wysoki CPU"</span>) |
30 | | -<span class="t-kw">elsif</span> cpu > <span class="t-num">50</span> <span class="t-kw">do</span> |
31 | | -println(<span class="t-str">"Umiarkowany"</span>) |
32 | | -<span class="t-kw">else</span> <span class="t-kw">do</span> |
33 | | -println(<span class="t-str">"CPU OK"</span>) |
34 | | -<span class="t-kw">end</span> |
35 | | -
|
36 | | -<span class="t-comment"># ── Operatory logiczne ────────────────────────────</span> |
37 | | -<span class="t-kw">if</span> port >= <span class="t-num">1</span> && port <= <span class="t-num">65535</span> <span class="t-kw">do</span> |
38 | | -println(<span class="t-str">"Port prawidłowy: "</span> + to_string(port)) |
39 | | -<span class="t-kw">end</span> |
| 11 | + <span class="t-kw">if</span> port == <span class="t-num">443</span> <span class="t-kw">is</span> |
| 12 | + write(<span class="t-str">"HTTPS"</span>) |
| 13 | + <span class="t-kw">elsif</span> port == <span class="t-num">80</span> <span class="t-kw">is</span> |
| 14 | + write(<span class="t-str">"HTTP"</span>) |
| 15 | + <span class="t-kw">elsif</span> port == <span class="t-num">22</span> <span class="t-kw">is</span> |
| 16 | + write(<span class="t-str">"SSH"</span>) |
| 17 | + <span class="t-kw">else</span> <span class="t-kw">is</span> |
| 18 | + write(<span class="t-str">"Other: "</span> + to_string(port)) |
| 19 | + <span class="t-kw">end</span> |
40 | 20 |
|
41 | | -<span class="t-comment"># ── Negacja ───────────────────────────────────────</span> |
42 | | -<span class="t-kw">let</span> ssl: bool = <span class="t-kw">true</span> |
43 | | -<span class="t-kw">if</span> !ssl <span class="t-kw">do</span> |
44 | | -println(<span class="t-str">"Ostrzeżenie: brak SSL!"</span>) |
| 21 | + <span class="t-comment">;; Złożone warunki</span> |
| 22 | + <span class="t-kw">let</span> open: bool = <span class="t-kw">true</span> |
| 23 | + <span class="t-kw">if</span> open && port > <span class="t-num">0</span> <span class="t-kw">is</span> |
| 24 | + write(<span class="t-str">"port otwarty"</span>) |
| 25 | + <span class="t-kw">end</span> |
45 | 26 | <span class="t-kw">end</span></pre></div></div> |
46 | 27 | </div> |
47 | 28 | </div> |
48 | 29 |
|
49 | | -<!-- ─ MATCH ──────────────────────────────────────────────────────────────── --> |
50 | 30 | <div class="section" id="match"> |
51 | 31 | <div class="sec-header"><span class="sec-num">08</span><h2>Match — pattern matching</h2></div> |
52 | | -<p>Pattern matching — elegancka alternatywa dla łańcuchów if/elsif. Obsługuje literały, zmienne, wildcard <code>_</code> i guardy <code>if</code>. Ciało: <code>match expr do ... end</code>. Ramiona: <code>wzorzec => expr</code>.</p> |
| 32 | +<p>Pełne pattern matching: literały, warianty enum, wildcard <code>_</code>, OR-pattern <code>a | b</code>. Blok: <code>match x is...end</code>.</p> |
53 | 33 | <div class="code-block"> |
54 | 34 | <div class="code-header"><span class="code-filename">match.h#</span><button class="copy-btn">Copy</button></div> |
55 | | -<div class="code-body"><div class="line-nums"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span><span>13</span><span>14</span><span>15</span><span>16</span><span>17</span><span>18</span><span>19</span><span>20</span><span>21</span><span>22</span><span>23</span><span>24</span><span>25</span><span>26</span><span>27</span><span>28</span><span>29</span><span>30</span><span>31</span><span>32</span><span>33</span><span>34</span><span>35</span></div> |
56 | | -<div class="code-inner"><pre><span class="t-comment"># ── Match: kody HTTP ──────────────────────────────</span> |
57 | | -<span class="t-kw">let</span> kod: int = <span class="t-num">404</span> |
58 | | -<span class="t-kw">match</span> kod <span class="t-kw">do</span> |
59 | | -<span class="t-num">200</span> => println(<span class="t-str">"OK"</span>) |
60 | | -<span class="t-num">201</span> => println(<span class="t-str">"Created"</span>) |
61 | | -<span class="t-num">400</span> => println(<span class="t-str">"Bad Request"</span>) |
62 | | -<span class="t-num">401</span> => println(<span class="t-str">"Unauthorized"</span>) |
63 | | -<span class="t-num">403</span> => println(<span class="t-str">"Forbidden"</span>) |
64 | | -<span class="t-num">404</span> => println(<span class="t-str">"Not Found"</span>) |
65 | | -<span class="t-num">500</span> => println(<span class="t-str">"Server Error"</span>) |
66 | | -_ => println(<span class="t-str">"Nieznany kod: "</span> + to_string(kod)) |
| 35 | +<div class="code-body"><div class="code-inner"><pre><span class="t-kw">fn</span> <span class="t-func">classify</span>(port: int) -> string <span class="t-kw">is</span> |
| 36 | + <span class="t-kw">match</span> port <span class="t-kw">is</span> |
| 37 | + <span class="t-num">22</span> => <span class="t-str">"SSH"</span> |
| 38 | + <span class="t-num">80</span> => <span class="t-str">"HTTP"</span> |
| 39 | + <span class="t-num">443</span> => <span class="t-str">"HTTPS"</span> |
| 40 | + <span class="t-num">3306</span> => <span class="t-str">"MySQL"</span> |
| 41 | + <span class="t-num">5432</span> => <span class="t-str">"PostgreSQL"</span> |
| 42 | + <span class="t-num">6379</span> => <span class="t-str">"Redis"</span> |
| 43 | + <span class="t-num">8080</span> => <span class="t-str">"HTTP-Alt"</span> |
| 44 | + _ => <span class="t-str">"Unknown"</span> |
| 45 | + <span class="t-kw">end</span> |
67 | 46 | <span class="t-kw">end</span> |
68 | 47 |
|
69 | | -<span class="t-comment"># ── Match ze stringiem ─────────────────────────────</span> |
70 | | -<span class="t-kw">let</span> env: string = <span class="t-str">"production"</span> |
71 | | -<span class="t-kw">match</span> env <span class="t-kw">do</span> |
72 | | -<span class="t-str">"production"</span> => println(<span class="t-str">"Środowisko: PROD"</span>) |
73 | | -<span class="t-str">"staging"</span> => println(<span class="t-str">"Środowisko: STAGING"</span>) |
74 | | -<span class="t-str">"development"</span> => println(<span class="t-str">"Środowisko: DEV"</span>) |
75 | | -_ => println(<span class="t-str">"Nieznane środowisko"</span>) |
| 48 | +<span class="t-kw">enum</span> Status <span class="t-kw">is</span> |
| 49 | + Open |
| 50 | + Closed |
| 51 | + Filtered(string) |
| 52 | + Error(int, string) |
76 | 53 | <span class="t-kw">end</span> |
77 | 54 |
|
78 | | -<span class="t-comment"># ── Match z blokiem wieloliniowym ─────────────────</span> |
79 | | -<span class="t-kw">let</span> port: int = <span class="t-num">22</span> |
80 | | -<span class="t-kw">fn</span> <span class="t-func">get_service</span>(port: int) -> string <span class="t-kw">do</span> |
81 | | -<span class="t-kw">match</span> port <span class="t-kw">do</span> |
82 | | -<span class="t-num">21</span> => <span class="t-str">"FTP"</span> |
83 | | -<span class="t-num">22</span> => <span class="t-str">"SSH"</span> |
84 | | -<span class="t-num">80</span> => <span class="t-str">"HTTP"</span> |
85 | | -<span class="t-num">443</span> => <span class="t-str">"HTTPS"</span> |
86 | | -<span class="t-num">3306</span> => <span class="t-str">"MySQL"</span> |
87 | | -<span class="t-num">5432</span> => <span class="t-str">"PostgreSQL"</span> |
88 | | -_ => <span class="t-str">"Unknown"</span> |
| 55 | +<span class="t-kw">fn</span> <span class="t-func">handle</span>(r: Status) <span class="t-kw">is</span> |
| 56 | + <span class="t-kw">match</span> r <span class="t-kw">is</span> |
| 57 | + Open => write(<span class="t-str">"otwarty"</span>) |
| 58 | + Closed => write(<span class="t-str">"zamknięty"</span>) |
| 59 | + Filtered(msg) => write(<span class="t-str">"filtr: "</span> + msg) |
| 60 | + Error(c, m) => write(<span class="t-str">"błąd "</span> + to_string(c) + <span class="t-str">": "</span> + m) |
| 61 | + <span class="t-kw">end</span> |
89 | 62 | <span class="t-kw">end</span> |
| 63 | +
|
| 64 | +<span class="t-kw">fn</span> <span class="t-func">main</span>() <span class="t-kw">is</span> |
| 65 | + write(classify(<span class="t-num">443</span>)) |
| 66 | + handle(Status::Open) |
| 67 | + handle(Status::Filtered(<span class="t-str">"firewall"</span>)) |
90 | 68 | <span class="t-kw">end</span></pre></div></div> |
91 | 69 | </div> |
92 | 70 | </div> |
93 | 71 |
|
94 | | -<!-- ─ WHILE ───────────────────────────────────────────────────────────────── --> |
95 | 72 | <div class="section" id="while"> |
96 | 73 | <div class="sec-header"><span class="sec-num">09</span><h2>While</h2></div> |
97 | | -<p>Pętla warunkowa. Składnia: <code>while warunek do...end</code>. Obsługuje <code>break</code> i <code>continue</code>.</p> |
98 | 74 | <div class="code-block"> |
99 | 75 | <div class="code-header"><span class="code-filename">while.h#</span><button class="copy-btn">Copy</button></div> |
100 | | -<div class="code-body"><div class="line-nums"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span><span>13</span><span>14</span><span>15</span><span>16</span><span>17</span><span>18</span><span>19</span><span>20</span></div> |
101 | | -<div class="code-inner"><pre><span class="t-comment"># ── Klasyczna pętla licząca ───────────────────────</span> |
102 | | -<span class="t-kw">let</span> <span class="t-kw">mut</span> i: int = <span class="t-num">0</span> |
103 | | -<span class="t-kw">while</span> i < <span class="t-num">10</span> <span class="t-kw">do</span> |
104 | | -println(to_string(i)) |
105 | | -i += <span class="t-num">1</span> |
106 | | -<span class="t-kw">end</span> |
107 | | -
|
108 | | -<span class="t-comment"># ── Z break ───────────────────────────────────────</span> |
109 | | -<span class="t-kw">let</span> <span class="t-kw">mut</span> running: bool = <span class="t-kw">true</span> |
110 | | -<span class="t-kw">let</span> <span class="t-kw">mut</span> attempts: int = <span class="t-num">0</span> |
111 | | -<span class="t-kw">while</span> running <span class="t-kw">do</span> |
112 | | -attempts += <span class="t-num">1</span> |
113 | | -<span class="t-kw">if</span> attempts >= <span class="t-num">5</span> <span class="t-kw">do</span> |
114 | | -break |
115 | | -<span class="t-kw">end</span> |
116 | | -<span class="t-kw">end</span> |
117 | | -
|
118 | | -<span class="t-comment"># ── Nieskończona pętla monitoringu ────────────────</span> |
119 | | -<span class="t-kw">let</span> <span class="t-kw">mut</span> alive: bool = <span class="t-kw">true</span> |
120 | | -<span class="t-kw">while</span> alive <span class="t-kw">do</span> |
121 | | -println(<span class="t-str">"monitoruję..."</span>) |
| 76 | +<div class="code-body"><div class="code-inner"><pre><span class="t-kw">fn</span> <span class="t-func">main</span>() <span class="t-kw">is</span> |
| 77 | + <span class="t-kw">let</span> <span class="t-kw2">mut</span> i: int = <span class="t-num">0</span> |
| 78 | + <span class="t-kw">while</span> i < <span class="t-num">10</span> <span class="t-kw">is</span> |
| 79 | + write(to_string(i)) |
| 80 | + i += <span class="t-num">1</span> |
| 81 | + <span class="t-kw">end</span> |
122 | 82 | <span class="t-kw">end</span></pre></div></div> |
123 | 83 | </div> |
124 | 84 | </div> |
125 | 85 |
|
126 | | -<!-- ─ FOR ────────────────────────────────────────────────────────────────── --> |
127 | 86 | <div class="section" id="for"> |
128 | | -<div class="sec-header"><span class="sec-num">10</span><h2>For — pętle i zakresy</h2></div> |
129 | | -<p>Iteracja po zakresach i tablicach. H# obsługuje <code>for var in start..end</code> (wyłączny), <code>start..=end</code> (włączny) oraz <code>for var in array</code>.</p> |
| 87 | +<div class="sec-header"><span class="sec-num">10</span><h2>For i zakresy</h2></div> |
130 | 88 | <div class="code-block"> |
131 | 89 | <div class="code-header"><span class="code-filename">for.h#</span><button class="copy-btn">Copy</button></div> |
132 | | -<div class="code-body"><div class="line-nums"><span>1</span><span>2</span><span>3</span><span>4</span><span>5</span><span>6</span><span>7</span><span>8</span><span>9</span><span>10</span><span>11</span><span>12</span><span>13</span><span>14</span><span>15</span><span>16</span><span>17</span><span>18</span><span>19</span><span>20</span><span>21</span><span>22</span><span>23</span><span>24</span></div> |
133 | | -<div class="code-inner"><pre><span class="t-comment"># ── Zakres wyłączny 0..N ──────────────────────────</span> |
134 | | -<span class="t-kw">for</span> i <span class="t-kw">in</span> <span class="t-num">0</span>..<span class="t-num">10</span> <span class="t-kw">do</span> |
135 | | -println(to_string(i)) <span class="t-comment"># 0..9</span> |
136 | | -<span class="t-kw">end</span> |
137 | | -
|
138 | | -<span class="t-comment"># ── Zakres włączny 1..=N ──────────────────────────</span> |
139 | | -<span class="t-kw">let</span> <span class="t-kw">mut</span> suma: int = <span class="t-num">0</span> |
140 | | -<span class="t-kw">for</span> i <span class="t-kw">in</span> <span class="t-num">1</span>..=<span class="t-num">5</span> <span class="t-kw">do</span> |
141 | | -suma += i <span class="t-comment"># 1+2+3+4+5 = 15</span> |
142 | | -<span class="t-kw">end</span> |
143 | | -println(<span class="t-str">"Suma 1..5 = "</span> + to_string(suma)) |
144 | | -
|
145 | | -<span class="t-comment"># ── Iteracja po tablicy ───────────────────────────</span> |
146 | | -<span class="t-kw">let</span> porty: [int] = [<span class="t-num">22</span>, <span class="t-num">80</span>, <span class="t-num">443</span>, <span class="t-num">8080</span>] |
147 | | -<span class="t-kw">for</span> port <span class="t-kw">in</span> porty <span class="t-kw">do</span> |
148 | | -println(<span class="t-str">"Port: "</span> + to_string(port)) |
149 | | -<span class="t-kw">end</span> |
| 90 | +<div class="code-body"><div class="code-inner"><pre><span class="t-kw">fn</span> <span class="t-func">main</span>() <span class="t-kw">is</span> |
| 91 | + <span class="t-comment">;; Zakres wyłączny (1..10 = 1,2,..,9)</span> |
| 92 | + <span class="t-kw">for</span> i <span class="t-kw">in</span> <span class="t-num">1</span>..<span class="t-num">10</span> <span class="t-kw">is</span> |
| 93 | + write(to_string(i)) |
| 94 | + <span class="t-kw">end</span> |
150 | 95 |
|
151 | | -<span class="t-comment"># ── Iteracja po stringu (znaki) ───────────────────</span> |
152 | | -<span class="t-kw">let</span> s: string = <span class="t-str">"hello"</span> |
153 | | -<span class="t-kw">for</span> ch <span class="t-kw">in</span> s <span class="t-kw">do</span> |
154 | | -print(ch) |
155 | | -<span class="t-kw">end</span> |
| 96 | + <span class="t-comment">;; Zakres włączny (1..=5 = 1,2,3,4,5)</span> |
| 97 | + <span class="t-kw">let</span> <span class="t-kw2">mut</span> sum: int = <span class="t-num">0</span> |
| 98 | + <span class="t-kw">for</span> i <span class="t-kw">in</span> <span class="t-num">1</span>..=<span class="t-num">100</span> <span class="t-kw">is</span> |
| 99 | + sum += i |
| 100 | + <span class="t-kw">end</span> |
| 101 | + write(<span class="t-str">"Sum: "</span> + to_string(sum)) |
156 | 102 |
|
157 | | -<span class="t-comment"># ── Scan portów 1-1024 ────────────────────────────</span> |
158 | | -<span class="t-kw">for</span> port <span class="t-kw">in</span> <span class="t-num">1</span>..=<span class="t-num">1024</span> <span class="t-kw">do</span> |
159 | | -<span class="t-comment"># skanuj port...</span> |
| 103 | + <span class="t-comment">;; Iteracja po tablicy</span> |
| 104 | + <span class="t-kw">let</span> ports: [int] = [<span class="t-num">22</span>, <span class="t-num">80</span>, <span class="t-num">443</span>, <span class="t-num">8080</span>] |
| 105 | + <span class="t-kw">for</span> port <span class="t-kw">in</span> ports <span class="t-kw">is</span> |
| 106 | + write(<span class="t-str">"Port: "</span> + to_string(port)) |
| 107 | + <span class="t-kw">end</span> |
160 | 108 | <span class="t-kw">end</span></pre></div></div> |
161 | 109 | </div> |
162 | 110 | </div> |
|
0 commit comments