Skip to content

Commit 0425da8

Browse files
committed
adapted changelog + fixed generics bug + added more hash functions for inbuilt types + more HashTable tests
1 parent ceccb50 commit 0425da8

File tree

8 files changed

+93
-28
lines changed

8 files changed

+93
-28
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Der Changelog von DDP. Sortiert nach Release.
1717
- [Neu] Externe generische Funktionen können in C mit generischen Listen und generischen Referenz Parametern arbeiten
1818
- [Neu] Generische Kombinationen, die Felder beliebigen Typs besitzen können
1919
- [Neu] Generische Funktionen, die mit Parametern beliebigen Typs arbeiten können
20+
- [Neu] Die Aliase für Kombinationen sind jetzt optional
2021
- [Neu] Bei Feldern von Kombinationen kann der explizite Standardwert jetzt weggelassen werden
2122

2223
## v0.6.0

lib/stdlib/Duden/HashTabelle.ddp

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,39 @@ Binde "Duden/TextBauer" ein.
77
Die öffentliche Funktion FNV_Hash mit dem Parameter t vom Typ Text Referenz, gibt eine Zahl zurück,
88
ist in "libddpstdlib.a" definiert
99
und kann so benutzt werden:
10-
"der Hash von <t>" oder
11-
"dem Hash von <t>" oder
12-
"den Hash von <t>"
10+
"der Hash von <t>"
11+
12+
[
13+
Gibt den Hash für die Zahl z zurück.
14+
]
15+
Die öffentliche Funktion Zahl_Hash mit dem Parameter z vom Typ Zahl, gibt eine Zahl zurück, macht:
16+
Gib z zurück.
17+
Und kann so benutzt werden:
18+
"der Hash von <z>"
19+
20+
[
21+
Gibt den Hash für die Kommazahl z zurück.
22+
]
23+
Die öffentliche Funktion Kommazahl_Hash mit dem Parameter z vom Typ Kommazahl, gibt eine Zahl zurück,
24+
ist in "libddpstdlib.a" definiert
25+
Und kann so benutzt werden:
26+
"der Hash von <z>"
27+
28+
[
29+
Gibt den Hash für den Buchstaben b zurück.
30+
]
31+
Die öffentliche Funktion Buchstaben_Hash mit dem Parameter b vom Typ Buchstabe, gibt eine Zahl zurück, macht:
32+
Gib b als Zahl zurück.
33+
Und kann so benutzt werden:
34+
"der Hash von <b>"
35+
36+
[
37+
Gibt den Hash für den Buchstaben b zurück.
38+
]
39+
Die öffentliche Funktion Wahrheitswert_Hash mit dem Parameter w vom Typ Wahrheitswert, gibt eine Zahl zurück, macht:
40+
Gib w als Zahl zurück.
41+
Und kann so benutzt werden:
42+
"der Hash von <w>"
1343

1444
[
1545
Representiert einen Eintrag in einer HashTabelle.
@@ -85,21 +115,15 @@ Die öffentliche generische Funktion Tabelle_Zu_Text mit dem Parameter tabelle v
85115

86116
Füge (Schlüssel von (einträge von tabelle an der Stelle i)) an b an.
87117
Füge ": " an b an.
88-
Die Variable v ist Wert von (einträge von tabelle an der Stelle i).
89-
90-
Wenn v eine Zahl ist, füge (v als Zahl als Text) an b an.
91-
Wenn aber v ein Text ist, füge (v als Text) an b an.
92-
Wenn aber v eine Kommazahl ist, füge (v als Kommazahl als Text) an b an.
93-
Wenn aber v ein Wahrheitswert ist, füge (v als Wahrheitswert als Text) an b an.
94-
Wenn aber v ein Buchstabe ist, füge (v als Buchstabe) an b an.
95-
Sonst füge "<Unbekannt>" an b an.
118+
Der W w ist Wert von (einträge von tabelle an der Stelle i).
119+
Füge (w als Text) an b an.
96120

97121
Wenn i ungleich die Länge von einträge von tabelle ist, füge ", " an b an.
98122

99123
Gib b als Text zurück.
100124
Und überlädt den "als" Operator.
101125

102-
Die generische Funktion Finde_Eintrag mit den Parametern tabelle und schlüssel vom Typ S-W-HashTabelle Referenz und Text Referenz, gibt eine Zahl zurück, macht:
126+
Die generische Funktion Finde_Eintrag mit den Parametern tabelle und schlüssel vom Typ S-W-HashTabelle Referenz und S Referenz, gibt eine Zahl zurück, macht:
103127
Die Zahl index ist der Hash von schlüssel modulo der Kapazität von tabelle plus 1.
104128
Die Zahl grabstein_index ist -1.
105129

@@ -194,9 +218,9 @@ Die öffentliche generische Funktion Tabellen_Wert_Löschen mit den Parametern t
194218
Die Zahl eintrag_index ist der Index für schlüssel in tabelle.
195219

196220
Wenn (einträge von tabelle an der Stelle eintrag_index) leer oder ein Grabstein ist, dann:
197-
Gib der Standardwert von einer Variable zurück.
221+
Gib der Standardwert von einem W zurück.
198222

199-
Die Variable wert ist Wert von (einträge von tabelle an der Stelle eintrag_index).
223+
Der W wert ist Wert von (einträge von tabelle an der Stelle eintrag_index).
200224
Speichere einen Grabstein ((der Standardwert von einem S), (der Standardwert von einem W)) in (einträge von tabelle an der Stelle eintrag_index).
201225
Gib wert zurück.
202226
Und kann so benutzt werden:

lib/stdlib/source/DDP/hash_table.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,13 @@ ddpint FNV_Hash(ddpstringref str) {
1717

1818
return (ddpint)hash;
1919
}
20+
21+
ddpint Kommazahl_Hash(ddpfloat k) {
22+
static_assert(sizeof(ddpint) == sizeof(ddpfloat), "sizeof(ddpint) == sizeof(ddpfloat) must hold true for hashing ddpfloat");
23+
union {
24+
ddpint i;
25+
ddpfloat f;
26+
} u = {.f = k};
27+
28+
return u.i;
29+
}

src/ddptypes/struct_type.go

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package ddptypes
22

3-
import "fmt"
3+
import (
4+
"fmt"
5+
)
46

57
// represents a single field of a struct
68
type StructField struct {
@@ -13,7 +15,8 @@ type StructField struct {
1315
// represents the type of a ddp struct
1416
type StructType struct {
1517
// name of the struct
16-
Name string
18+
Name string
19+
cachedName *string
1720
// grammatical gender of the struct name
1821
GramGender GrammaticalGender
1922
// fields of the struct
@@ -32,21 +35,26 @@ func (t *StructType) Gender() GrammaticalGender {
3235
}
3336

3437
func (t *StructType) String() string {
35-
return t.Name
36-
}
38+
if t.cachedName != nil {
39+
return *t.cachedName
40+
}
3741

38-
func (t *StructType) Format(f fmt.State, verb rune) {
39-
switch verb {
40-
case 's':
41-
if t.genericType != nil {
42-
for _, typParam := range t.instantiatedWith {
43-
fmt.Fprintf(f, "%s-", typParam)
42+
name := ""
43+
if t.genericType != nil {
44+
for _, typParam := range t.instantiatedWith {
45+
typParamString := typParam.String()
46+
if _, ok := typParam.(*StructType); ok {
47+
name += fmt.Sprintf("(%s)-", typParamString)
48+
} else {
49+
name += fmt.Sprintf("%s-", typParamString)
4450
}
4551
}
46-
fmt.Fprintf(f, "%s", t.String())
47-
default:
48-
fmt.Fprintf(f, fmt.FormatString(f, verb), t)
4952
}
53+
name += t.Name
54+
55+
t.cachedName = &name
56+
57+
return *t.cachedName
5058
}
5159

5260
// checks wether two structs are structurally equal, that is

src/parser/typechecker/typechecker.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -894,7 +894,11 @@ func IsPublicType(typ ddptypes.Type, table ast.SymbolTable) bool {
894894
if ddptypes.IsTypeAlias(typ) || ddptypes.IsStruct(typ) {
895895
// get the corresponding decl from the current scope
896896
// because it contains imported types as well
897-
decl, _, _ := table.LookupDecl(typ.String())
897+
lookupName := typ.String()
898+
if structType, ok := typ.(*ddptypes.StructType); ok {
899+
lookupName = structType.Name
900+
}
901+
decl, _, _ := table.LookupDecl(lookupName)
898902
return decl.Public()
899903
}
900904

-46.1 KB
Binary file not shown.

tests/testdata/stdlib/HashTabelle/HashTabelle.ddp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,18 @@ Schreibe ("" in t enthalten ist) auf eine Zeile.
1414
Schreibe ((t an der Stelle "") als Text) auf eine Zeile.
1515
Schreibe ((den gelöschten Wert für "" in t) als Text) auf eine Zeile.
1616

17+
Die Zahl-Text-HashTabelle zt ist der Standardwert von einer Zahl-Text-HashTabelle.
18+
Setze den Wert von 0 in zt auf "0".
19+
Schreibe (0 in zt enthalten ist) auf eine Zeile.
20+
Schreibe (zt an der Stelle 0) auf eine Zeile.
21+
Schreibe (den gelöschten Wert für 0 in zt) auf eine Zeile.
22+
23+
Die Kommazahl-Text-HashTabelle kzt ist der Standardwert von einer Kommazahl-Text-HashTabelle.
24+
Setze den Wert von 1,5 in kzt auf "1,5".
25+
Schreibe (1,5 in kzt enthalten ist) auf eine Zeile.
26+
Schreibe (kzt an der Stelle 1,5) auf eine Zeile.
27+
Schreibe (den gelöschten Wert für 1,5 in kzt) auf eine Zeile.
28+
1729
[ "Fuzz" testing (not really :( ) ]
1830
Schreibe "fuzz" auf eine Zeile.
1931

tests/testdata/stdlib/HashTabelle/expected.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,11 @@ simple
22
wahr
33
leer
44
leer
5+
wahr
6+
0
7+
0
8+
wahr
9+
1,5
10+
1,5
511
fuzz
612
Erfolg

0 commit comments

Comments
 (0)