Język Xi

Pojawia się sporo wątpliwości dotyczących specyfikacji języka Xi.
Myślę, że studentom jak i pracownikom przyda się jeden, dostępny dla wszystkich kanał komunikacji.
Wszelkie niejasności można by rozstrzygać w tym temacie.

2 polubienia
  1. Czy wyrażenie f()[0] = 1 jest poprawne? Patrząc na to ja działa mod_uwr to wychodzi na to, że nie. Nie ma jednak na to testu, a na skosie jest napisane, że:

Komórka pamięci jest opisana przez typ lvalue i może być albo identyfikatorem albo komórką w tablicy.

a skoro wynik funkcji może być listą to w szczególności f()[0] może być komórką w tablicy. Wydaje się, że pdf języka Xi również tego nie wyklucza, wyklucza natomiast wyrażenia w nawiasach oraz listy anonimowe:

An assignment to a variable or to an array element. However, the left-hand side of an assignment (and
thus the assignment itself) cannot begin with an open parenthesis (() or an open brace ({).

  1. Brakuje udokumentowania który z UNOP_Not, UNOP_Neg to logiczna negacja a który liczbowa - nazewnictwo wydaje się troche nieoczywiste, chociaż to może tylko dla mnie. W ast.ml nie ma funkcji string_of_unop i trzeba szukać wyjaśnienia w innych miejsach - nawiasem mówiąc są dwie identyczne funkcje string_of_binop, jedna w ast.ml a druga w ast_printer.ml (i analogicznie dla relop).

  2. Była o tym dyskusja na konsultacjach, ale już nie jestem pewien na czym stanęło:

return statement may only be used inside a block and must be the last statement in its block.

Czy powyższy wymóg ma być walidowany na poziomie parsera? Wydaje się, że nie, ale wtedy dostajemy następujący konflikt - czy poniższa linijka to jeden statement, czy dwa?

return f()

Możemy myśleć o tym jako o zwróceniu wyniku funkcji f albo jako o return; f(); (typy by się nie zgadzały ale typechecker działa po parserze)

2 polubienia

W mod_uwr:
f() { x = '\n' } przechodzi a f() { x = '\t' } nie. Tak ma być?

EDIT:
\r też nie przechodzi.

_ , _ = foo() jest dozwolone a _ = foo() nie.

Jest to opisane na SKOSie

Przyjmijmy, że konstrukcja STMT_MultiVarDecl nigdy nie opisuje jednego wiązania. To znaczy, że…
_ = f() // nieprawidłowe

1 polubienie

Jak w końcu jest z opcjonalnym separatorem w inicjalizacji tablic tj.
tab : int[] = { 2, }
Poprawne czy nie?