Зміст
Я розділю моє пояснення Tarján псевдокоді «S в наступних розділах:
- Блоки Tarjan's If-else ( оператори
->
та |
оператори)
- Тести призначення та рівності (
:=
і =
)
- Існує
else if
, але немає else
конструкції
- Оператор умовного призначення Тарджана
:= if
Додаткові приклади Тарджана if
та:= if
5.5.
Tarjan масиви (або списки)
Підсумок операторів
- Оператор зі стрілкою з двократкою Таряна (
⟷
)
- Do-петлі Tarjan схожі на C / Java while-loops
- Оператор умовного призначення Таряна з усіма помилковими умовами
(1) Блоки Таряна, якщо інакше
(оператори →
та |
)
if-else
Конструкція є , мабуть, найбільш фундаментальною структурою управління на мові Tarján в. На додаток до C-подібних if-блоків, поведінка if-else дуже вбудована в завдання Тарджана та циклів у той час як Tarjan. Оператор стрілки Tarjan ->
(або →) - це роздільник між умовою if-оператора і блоком виконання оператора if.
Наприклад, мовою Тарджана у нас може бути:
# Example One
if a = 4 → x := 9 fi
Якщо ми частково переведемо рядок коду Tarjan вище в C або Java, отримаємо наступне:
if (a = 4)
x := 9
fi
Замість правильних фігурних дужок (як у C та Java) if
Тарджан закінчує -блок із зворотним написанням ключового слова, схожим на ALGOL:fi
Якщо ми продовжимо перекладати наш вище приклад, отримаємо:
if (a = 4) {
x := 9
}
(2) Тести призначення та рівності ( :=
і =
)
Тарджан приймає цих операторів від ALGOL (пізніше його також бачили у Паскалі).
Тарджан використовує =
для тестів рівності, а не для присвоєнь (тому він працює як Java ==
).
Для призначення Tarjan використовує :=
, що працює як Java =
.
Таким чином, якщо ми продовжуємо перекладати наш приклад, ми маємо:
if (a == 4) {
x = 9
}
Вертикальна смуга (або "труба" або |
) мовою Тарджана еквівалентна else if
ключовому слову в C або Java.
Наприклад, мовою Тарджана у нас може бути:
# Example Two
if a = 4 → x := 9 | a > 4 → y := 11 fi
Код Тарджана вище означає:
if (a == 4) {
x = 9
}
else if (a > 4) {
y = 11
}
(3) else if
тільки і без else
конструкції
Раніше я висвітлював основи if
-статей, не описуючи нюанси. Однак ми не будемо обговорювати невелику деталь. Останній пункт if-else
блоку Tarjan-ian повинен завжди містити оператор стрілки ( →
). Як такої, else
мови Тарджана немає лише else if
. Найближчим до else
-блока в мові Тарджана - це зробити правильний тестовий стан true
.
if a = 4 → x := 9 | a > 4 → y := 11 | true → z := 99 fi
У C / Java ми мали б:
if (a == 4) {
x = 9
}
else if (a > 4) {
y = 11
}
else { // else if (true)
z = 99
}
Приклади легше зрозуміти, ніж загальні описи. Однак тепер, коли ми маємо кілька прикладів під своїм поясом, знайте, що загальна форма формату конструкції Тарджана якщо інакше така:
if condition
→ stuff to do
| condition
→ stuff to do
[...]
| condition
→ stuff to do
fi
Характер |
схожийif else
Символ →
відокремлює умову тесту від завдання, яке потрібно виконати.
(4) Оператор умовного призначення Таряна := if
Тарджана if
можна використовувати два дуже різні способи. Поки ми описали лише одне із застосувань Тар'яни if
. Трохи заплутано, Тарджан все ще використовує позначення / синтаксис if
для другого типу if
-конструкції. Що if
використовується, базується на контексті. Аналіз контексту насправді зробити дуже просто, оскільки другий тип Тарджана if
- завжди заздалегідь зафіксований оператором призначення.
Наприклад, у нас може бути такий код Таряна:
# Example Three
x := if a = 4 → 9 fi
Почніть Digression
Працюючи з кодом Tarjan деякий час, ви звикаєте до порядку операцій. Якщо ми встановимо в дужках умову тесту в наведеному вище прикладі, отримаємо:
x := if (a = 4) → 9 fi
a = 4
не є операцією призначення. a = 4
це як a == 4
- повертає правду чи хибність.
Кінцеве відступлення
Це може допомогти розглянути := if
як синтаксис для одного оператора, відмінне від :=
і if
насправді, ми будемо називати := if
оператора як оператора "умовного призначення".
Бо if
ми перераховуємо (condition → action)
. Оскільки := if
ми перераховуємо, (condition → value)
де value
це праворучне значення, яке ми можемо призначити лівомуlhs
# Tarjan Example Four
lhs := if (a = 4) → rhs fi
на мові C або Java може виглядати так:
# Example Four
if (a == 4) {
lhs = rhs
}
Розглянемо наступний приклад "умовного призначення" в Тар'янському коді:
# Тарджан Ігнорування прикладу п’ять x: = a = 4 → 9 | a> 4 → 11 | правда → 99 fi
У C / Java ми мали б:
// C/Java Instantiation of Example Five
if (a == 4) {
x = 9
}
else if (a > 4) {
x = 11
}
else if (true) { // else
x = 99
}
(5) Підсумок операторів:
Поки що ми маємо:
:=
...... Оператор призначення (C / Java =
)
=
...... Тест рівності (C / Java ==
)
→
...... Розмежувач між умовою тесту блоку if-блоком та тілом блоку if-блоку
|
..... C / Java else-if
if ... fi
..... if-else блок
:= if... fi
..... Умовне призначення на основі блоку if-else
(5.5) Списки / масиви Tarjan:
Мова Tarjan має вбудовані контейнери, схожі на масив. Синтаксис масивів Tarjan набагато інтуїтивніше, ніж позначення для if else
тверджень Tarjan .
list1 := ['lion', 'witch', 'wardrobe'];
list2a := [1, 2, 3, 4, 5];
list2b := [1, 2];
list3 := ["a", "b", "c", "d"];
list4 := [ ]; # an empty array
Елементи масиву Tarjan доступні в дужках ()
, а не в квадратних дужках[]
Індексація починається з 1
. Таким чином,
list3 := ["a", "b", "c", "d"]
# list3(1) == "a" returns true
# list3(2) == "b" return true
Нижче показано, як створити новий масив, що містить 1-й та 5-й елементи [1, 2, 3, 4, 5, 6, 7]
nums := [1, 2, 3, 4, 5, 6, 7]
new_arr := [nums(1), nums(5)]
Оператор рівності визначений для масивів. Наступний код друкуєтьсяtrue
x := false
if [1, 2] = [1, 2, 3, 4, 5] --> x := true
print(x)
Шлях Таряна перевірити, чи масив порожній - порівняти його з порожнім масивом
arr := [1, 2]
print(arr = [ ])
# `=` is equality test, not assignment
Можна створити перегляд (а не копіювати) підмасиву, надавши оператору кілька індексів у ()
поєднанні з..
list3 := ["a", "b", "c", "d"]
beg := list3(.. 2)
# beg == ["a", "b"]
# beg(1) == "a"
end := list3(3..)
# end == ["c", "d"]
# end(1) == "c"
mid := list3(2..3)
# mid == ["b", "c"]
# mid(2) == "c"
# `list3(4)` is valid, but `mid(4)` is not
(6) Додаткові приклади Тарджана if
та:= if
Далі наведено ще один приклад умовного призначення Таряна ( := if
):
# Tarjan Example Six
a := (false --> a | true --> b | false --> c1 + c2 | (2 + 3 < 99) --> d)
(true --> b)
є крайнім лівим (cond --> action)
пунктом, що має справжню умову. Таким чином, вихідний приклад Приклад Шість має таку саму поведінку призначення, як іa := b
Нижче наш найскладніший приклад коду Tarjan на даний момент:
# Tarjan Example -- merge two sorted lists
list function merge (list s, t);
return if s =[] --> t
| t = [ ] --> s
| s != [ ] and t != [] and s(l) <= t(1) -->
[s(1)]& merge(s[2..], t)
| s != [ ]and t != [ ] and s(1) > r(l) -->
[t(1)] & merge (s,t(2..))
fi
end merge;
Далі - переклад коду Тарджана для об'єднання двох відсортованих списків. Далі не зовсім C або Java, але це набагато ближче до C / Java, ніж версія Tarjan.
list merge (list s, list t) {
if (s is empty) {
return t;
}
else if (t is empty){
return s;
}
else if (s[1] <= t[1]) {
return CONCATENATE([s[1]], merge(s[2...], t));
else { // else if (s[1] > t[1])
return CONCATENATE ([t[1]], merge(s,t[2..]);
}
}
Нижче ще один приклад коду Tarjan та перекладу чимось схожим на C або Java:
heap function meld (heap h1, h2);
return if h1 = null --> h2
| h2 = null --> h1
| h1 not null and h2 not null --> mesh (h1, h2)
fi
end meld;
Нижче переклад C / Java:
HeapNode meld (HeapNode h1, HeapNode h2) {
if (h1 == null) {
return h2;
}
else if (h2 == null) {
return h1;
} else {
mesh(h1, h2)
}
} // end function
(7) Оператор зі стрілкою з двократкою Таряна ( <-->
)
Нижче наведено приклад коду Tarjan:
x <--> y
Що робить ⟷
оператор подвійної стрілки ( ) мовою Тарджана?
Ну, майже всі змінні в мові Таряна є покажчиками.
<-->
- це операція своп. Наступні відбиткиtrue
x_old := x
y_old := y
x <--> y
print(x == y_old) # prints true
print(y == x_old) # prints true
Після виконання x <--> y
, x
вказує на об'єкт , який y
використовується для вказівки , і y
вказує на об'єкт , який x
використовується для вказівки.
Нижче наводиться оператор Tarjan за допомогою <-->
оператора:
x := [1, 2, 3]
y := [4, 5, 6]
x <--> y
Нижче переклад з коду Тарджана вище на альтернативний псевдокод:
Pointer X = address of array [1, 2, 3];
Pointer Y = address of array [4, 5, 6];
Pointer X_OLD = address of whatever X points to;
X = address of whatever Y points to;
Y = address of whatever X_OLD points to;
Як варіант, ми могли б мати:
void operator_double_arrow(Array** lhs, Array** rhs) {
// swap lhs and rhs
int** old_lhs = 0;
old_lhs = lhs;
*lhs = *rhs;
*rhs = *old_lhs;
return;
}
int main() {
Array* lhs = new Array<int>(1, 2, 3);
Array* rhs = new Array<int>(4, 5, 6);
operator_double_arrow(&lhs, &rhs);
delete lhs;
delete rhs;
return 0;
}
Нижче наводиться приклад однієї з функцій Tarjan за допомогою ⟷
оператора:
heap function mesh (heap nodes h1, h2);
if key(h1) > key(h2) → h1 ⟷ h2 fi;
right (h1) := if right(h1) = null → h2
|right(h1) ≠ null → mesh (right(h1), h2)
fi;
if rank (left (h1)) < rank (right (h1))
→ left(h1) ⟷ right(h1)
fi;
rank (h1) := rank(right(h1)) + 1;
return h1;
end mesh;
Нижче переклад функції Таряна mesh
в псевдо-код, який не є C, але більше схожий на C (відносно кажучи). Мета цього - проілюструвати, як ⟷
працює оператор Tarjan .
node pointer function mesh(node pointers h1, h2) {
if (h1.key) > h2.key) {
// swap h1 and h2
node pointer temp;
temp = h1;
h1 = h2;
h2 = temp;
}
// Now, h2.key <= h1.key
if (h1.right == null) {
h1.right = h2;
} else // h1.key != null {
h1.right = mesh(h1.right, h2);
}
if (h1.left.rank < h1.right.rank ) {
// swap h1.left and h1.right
node pointer temp;
temp = h1;
h1 = h2;
h2 = temp;
}
h1.rank = h1.right.rank + 1;
return h1;
}
(8) do-петлі Tarjan схожі на C / Java while-loops
Мова if
та for
конструкції Таряна знайомі програмістам на C / Java. Однак ключове слово Tarjan для циклу while є do
. Усі do
контури закінчуються ключовим словом od
, яке є зворотним написанням do
. Нижче наведено приклад:
sum := 0
do sum < 50 → sum := sum + 1
У псевдокоді в стилі С ми маємо:
sum = 0;
while(sum < 50) {
sum = sum + 1;
}
Сказане насправді не зовсім правильно. До-петля Tarjan - це справді C / Java while(true)
, якщо все-таки вкладений блок if-else. Більш буквальний переклад коду Таряна полягає в наступному:
sum = 0;
while(true) {
if (sum < 50) {
sum = sum + 1;
continue;
// This `continue` statement is questionable
}
break;
}
Нижче у нас є складніший do
Tarjan -loop:
sum := 0
do sum < 50 → sum := sum + 1 | sum < 99 → sum := sum + 5
do
Псевдокод у стилі C / Java для складної Tarjan -loop такий:
sum = 0;
while(true) {
if (sum < 50) {
sum = sum + 1;
continue;
}
else if (sum < 99) {
sum = sum + 5;
continue;
}
break;
}
(9) Оператор умовного призначення Таряна з усіма помилковими умовами
Хоча довге пояснення вище стосується більшості речей, деякі питання залишаються невирішеними. Я сподіваюся, що хтось хтось коли-небудь напише нову вдосконалену відповідь на основі моєї, яка відповідає на ці країни.
Зокрема, коли використовується оператор умовного призначення := if
, і жодна умова не відповідає дійсності, я не є тим, яке значення присвоюється змінній.
x := if (False --> 1| False --> 2 | (99 < 2) --> 3) fi
Я не впевнений, але можливо, що жодне завдання не робиться x
:
x = 0;
if (false) {
x = 1;
}
else if (false) {
x = 2;
}
else if (99 < 2) {
x = 3;
}
// At this point (x == 0)
Ви можете вимагати := if
попередньо оголосити ліву змінну, показану у виписці. У цьому випадку, навіть якщо всі умови помилкові, змінна все одно матиме значення.
Крім того, можливо, всі помилкові умови представляють помилку виконання. Інша альтернатива - повернути спеціальне null
значення та зберегти null
в лівій аргументі завдання.