Skip to content

Structures

IsaacShelton edited this page Nov 16, 2022 · 3 revisions

Structures

Structures allow for multiple data types to be combined together

Declaration

Structures are declared by using the struct keyword followed by a list of fields.

struct Employee (name String, age int, productivity float)

Usage Example

import basics
struct Tree (age int, height int)
func main {
tree Tree
tree.age = 12
tree.height = 43
print("tree.age => " + tree.age)
print("tree.height => " + tree.height)
}
tree.age => 12
tree.height => 43

Reducing Redundancy

Sometimes when declaring structures, multiple fields in a row will have the same type repeated for each of them.

struct Person (firstname String, lastname String, occupation String)

When this is the case, you can omit all of the repeated types expect the final one in order to simplify the definition.

struct Person (firstname, lastname, occupation String)

Embedded Structures

Sometimes it's desired to share the same fields as another struct. In order to make this easier, you can include fields of an already defined structure into a new one using the struct keyword followed by the name of the structure.

struct Human (age int)
struct Citizen (struct Human, name String)
struct Doctor (struct Citizen, experience int, salary ulong)

If the included structure comes first in the field list, then the newly created structure will also be valid as the included structure when taken as a pointer and casted.

import basics
struct Point2D (x, y float)
struct Point3D (struct Point2D, z float)
func distanceToOrigin(p Point2D) float {
return sqrtf(p.x * p.x + p.y * p.y)
}
func main {
point Point3D
point.x = 3.0f
point.y = 4.0f
point.z = 2.0f
xy_distance float = distanceToOrigin(*cast *Point2D &point)
print("2D distance to origin => " + xy_distance)
}
2D distance to origin => 5.0

Structure Domains

Structure definitions can optionally be followed by a structure domain, in which all function declarations inside will be made into methods

import basics
struct Person (firstname, lastname String) {
func getFullname String {
return this.firstname + " " + this.lastname
}
}
func main {
person Person
person.firstname = "Isaac"
person.lastname = "Shelton"
print("Person's name is: " + person.getFullname())
}
Person's name is: Isaac Shelton

Packed Structures

By default, structures contain padding in order to improve access performance.

This can be disabled using the packed keyword.

packed struct MyFileHeader (magic ushort, version uint, offset1, offset2 usize)

Records

Records are structures that the compiler will automatically generate a constructor for.

Records are usually preferrable for holding data over regular structures.

record Person (firstname, lastname String, age int)
func main {
person Person = Person("Bekah", "Armstrong", 19)
printf("%S %S is %d years old\n", person.firstname, person.lastname, person.age)
}

See records for more information

Anonymous Structures

Structure types can also be used anonymously without a name

import basics
import math
func main {
point struct (x, y, z float)
point.x = 1.0f
point.y = 2.0f
point.z = 3.0f
printf("Distance to origin is %hf\n", distanceToOrigin(point))
}
func distanceToOrigin(p struct (x, y, z float)) float {
return sqrt(p.x * p.x + p.y * p.y + p.z * p.z)
}

In order for two anonymous structure types to be considered compatible, they must have the same fields and the same structural layout.

For example:

The types struct (x, y float) and struct (u, v float) are incompatible.

And also the types struct (a, b int) and struct (b, a int) are incompatible.

Anonymous Composite Fields

Structs and unions can be used as anonymous wrappers for fields.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)

In the above example, the type FloatOrIntVec3 has 7 fields, some of which overlap in memory:

  • is_floats
  • xf
  • yf
  • zf
  • xi
  • yi
  • zi

However there's an anonymous union of two anonymous structs, which are unnamed, so the names of the sub fields are promoted to be directly accessible from the next higher name scope.

Because of this, we can access members like xf directly instead of having to go through a field.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)
// Can access 'xf' via 'this.xf' where 'this' is a '*FloatOrIntVec3'
// since the union field is unnamed and also the struct field of type `struct (xf, xy, xz float)` is unnamed

versus

struct FloatOrIntVec3 (
is_floats bool,
data union (
float_info struct (xf, yf, zf float),
int_info struct (xi, yi, zi int)
)
)
// We have to access 'xf' via 'this.data.float_info.xf' (where 'this' is a '*FloatOrIntVec3')
// since the union field 'data' is named and also the struct field 'float_info' is named

Classes

Classes are structures which can have virtual methods defined on them.

import basics
class Shape () {
constructor {}
virtual func getArea() float = 0.0
}
class Rectangle extends Shape (w, h float) {
constructor(w, h float){
this.w = w
this.h = h
}
override func getArea() float = this.w * this.h
}
func main {
shape *Shape = new Rectangle(5, 10)
defer delete shape
print(shape.getArea())
}

See classes for more information.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Structures · AdeptLanguage/Adept Wiki · GitHub
Skip to content

Structures

IsaacShelton edited this page Nov 16, 2022 · 3 revisions

Structures

Structures allow for multiple data types to be combined together

Declaration

Structures are declared by using the struct keyword followed by a list of fields.

struct Employee (name String, age int, productivity float)

Usage Example

import basics
struct Tree (age int, height int)
func main {
tree Tree
tree.age = 12
tree.height = 43
print("tree.age => " + tree.age)
print("tree.height => " + tree.height)
}
tree.age => 12
tree.height => 43

Reducing Redundancy

Sometimes when declaring structures, multiple fields in a row will have the same type repeated for each of them.

struct Person (firstname String, lastname String, occupation String)

When this is the case, you can omit all of the repeated types expect the final one in order to simplify the definition.

struct Person (firstname, lastname, occupation String)

Embedded Structures

Sometimes it's desired to share the same fields as another struct. In order to make this easier, you can include fields of an already defined structure into a new one using the struct keyword followed by the name of the structure.

struct Human (age int)
struct Citizen (struct Human, name String)
struct Doctor (struct Citizen, experience int, salary ulong)

If the included structure comes first in the field list, then the newly created structure will also be valid as the included structure when taken as a pointer and casted.

import basics
struct Point2D (x, y float)
struct Point3D (struct Point2D, z float)
func distanceToOrigin(p Point2D) float {
return sqrtf(p.x * p.x + p.y * p.y)
}
func main {
point Point3D
point.x = 3.0f
point.y = 4.0f
point.z = 2.0f
xy_distance float = distanceToOrigin(*cast *Point2D &point)
print("2D distance to origin => " + xy_distance)
}
2D distance to origin => 5.0

Structure Domains

Structure definitions can optionally be followed by a structure domain, in which all function declarations inside will be made into methods

import basics
struct Person (firstname, lastname String) {
func getFullname String {
return this.firstname + " " + this.lastname
}
}
func main {
person Person
person.firstname = "Isaac"
person.lastname = "Shelton"
print("Person's name is: " + person.getFullname())
}
Person's name is: Isaac Shelton

Packed Structures

By default, structures contain padding in order to improve access performance.

This can be disabled using the packed keyword.

packed struct MyFileHeader (magic ushort, version uint, offset1, offset2 usize)

Records

Records are structures that the compiler will automatically generate a constructor for.

Records are usually preferrable for holding data over regular structures.

record Person (firstname, lastname String, age int)
func main {
person Person = Person("Bekah", "Armstrong", 19)
printf("%S %S is %d years old\n", person.firstname, person.lastname, person.age)
}

See records for more information

Anonymous Structures

Structure types can also be used anonymously without a name

import basics
import math
func main {
point struct (x, y, z float)
point.x = 1.0f
point.y = 2.0f
point.z = 3.0f
printf("Distance to origin is %hf\n", distanceToOrigin(point))
}
func distanceToOrigin(p struct (x, y, z float)) float {
return sqrt(p.x * p.x + p.y * p.y + p.z * p.z)
}

In order for two anonymous structure types to be considered compatible, they must have the same fields and the same structural layout.

For example:

The types struct (x, y float) and struct (u, v float) are incompatible.

And also the types struct (a, b int) and struct (b, a int) are incompatible.

Anonymous Composite Fields

Structs and unions can be used as anonymous wrappers for fields.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)

In the above example, the type FloatOrIntVec3 has 7 fields, some of which overlap in memory:

  • is_floats
  • xf
  • yf
  • zf
  • xi
  • yi
  • zi

However there's an anonymous union of two anonymous structs, which are unnamed, so the names of the sub fields are promoted to be directly accessible from the next higher name scope.

Because of this, we can access members like xf directly instead of having to go through a field.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)
// Can access 'xf' via 'this.xf' where 'this' is a '*FloatOrIntVec3'
// since the union field is unnamed and also the struct field of type `struct (xf, xy, xz float)` is unnamed

versus

struct FloatOrIntVec3 (
is_floats bool,
data union (
float_info struct (xf, yf, zf float),
int_info struct (xi, yi, zi int)
)
)
// We have to access 'xf' via 'this.data.float_info.xf' (where 'this' is a '*FloatOrIntVec3')
// since the union field 'data' is named and also the struct field 'float_info' is named

Classes

Classes are structures which can have virtual methods defined on them.

import basics
class Shape () {
constructor {}
virtual func getArea() float = 0.0
}
class Rectangle extends Shape (w, h float) {
constructor(w, h float){
this.w = w
this.h = h
}
override func getArea() float = this.w * this.h
}
func main {
shape *Shape = new Rectangle(5, 10)
defer delete shape
print(shape.getArea())
}

See classes for more information.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Structures · AdeptLanguage/Adept Wiki · GitHub
Skip to content

Structures

IsaacShelton edited this page Nov 16, 2022 · 3 revisions

Structures

Structures allow for multiple data types to be combined together

Declaration

Structures are declared by using the struct keyword followed by a list of fields.

struct Employee (name String, age int, productivity float)

Usage Example

import basics
struct Tree (age int, height int)
func main {
tree Tree
tree.age = 12
tree.height = 43
print("tree.age => " + tree.age)
print("tree.height => " + tree.height)
}
tree.age => 12
tree.height => 43

Reducing Redundancy

Sometimes when declaring structures, multiple fields in a row will have the same type repeated for each of them.

struct Person (firstname String, lastname String, occupation String)

When this is the case, you can omit all of the repeated types expect the final one in order to simplify the definition.

struct Person (firstname, lastname, occupation String)

Embedded Structures

Sometimes it's desired to share the same fields as another struct. In order to make this easier, you can include fields of an already defined structure into a new one using the struct keyword followed by the name of the structure.

struct Human (age int)
struct Citizen (struct Human, name String)
struct Doctor (struct Citizen, experience int, salary ulong)

If the included structure comes first in the field list, then the newly created structure will also be valid as the included structure when taken as a pointer and casted.

import basics
struct Point2D (x, y float)
struct Point3D (struct Point2D, z float)
func distanceToOrigin(p Point2D) float {
return sqrtf(p.x * p.x + p.y * p.y)
}
func main {
point Point3D
point.x = 3.0f
point.y = 4.0f
point.z = 2.0f
xy_distance float = distanceToOrigin(*cast *Point2D &point)
print("2D distance to origin => " + xy_distance)
}
2D distance to origin => 5.0

Structure Domains

Structure definitions can optionally be followed by a structure domain, in which all function declarations inside will be made into methods

import basics
struct Person (firstname, lastname String) {
func getFullname String {
return this.firstname + " " + this.lastname
}
}
func main {
person Person
person.firstname = "Isaac"
person.lastname = "Shelton"
print("Person's name is: " + person.getFullname())
}
Person's name is: Isaac Shelton

Packed Structures

By default, structures contain padding in order to improve access performance.

This can be disabled using the packed keyword.

packed struct MyFileHeader (magic ushort, version uint, offset1, offset2 usize)

Records

Records are structures that the compiler will automatically generate a constructor for.

Records are usually preferrable for holding data over regular structures.

record Person (firstname, lastname String, age int)
func main {
person Person = Person("Bekah", "Armstrong", 19)
printf("%S %S is %d years old\n", person.firstname, person.lastname, person.age)
}

See records for more information

Anonymous Structures

Structure types can also be used anonymously without a name

import basics
import math
func main {
point struct (x, y, z float)
point.x = 1.0f
point.y = 2.0f
point.z = 3.0f
printf("Distance to origin is %hf\n", distanceToOrigin(point))
}
func distanceToOrigin(p struct (x, y, z float)) float {
return sqrt(p.x * p.x + p.y * p.y + p.z * p.z)
}

In order for two anonymous structure types to be considered compatible, they must have the same fields and the same structural layout.

For example:

The types struct (x, y float) and struct (u, v float) are incompatible.

And also the types struct (a, b int) and struct (b, a int) are incompatible.

Anonymous Composite Fields

Structs and unions can be used as anonymous wrappers for fields.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)

In the above example, the type FloatOrIntVec3 has 7 fields, some of which overlap in memory:

  • is_floats
  • xf
  • yf
  • zf
  • xi
  • yi
  • zi

However there's an anonymous union of two anonymous structs, which are unnamed, so the names of the sub fields are promoted to be directly accessible from the next higher name scope.

Because of this, we can access members like xf directly instead of having to go through a field.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)
// Can access 'xf' via 'this.xf' where 'this' is a '*FloatOrIntVec3'
// since the union field is unnamed and also the struct field of type `struct (xf, xy, xz float)` is unnamed

versus

struct FloatOrIntVec3 (
is_floats bool,
data union (
float_info struct (xf, yf, zf float),
int_info struct (xi, yi, zi int)
)
)
// We have to access 'xf' via 'this.data.float_info.xf' (where 'this' is a '*FloatOrIntVec3')
// since the union field 'data' is named and also the struct field 'float_info' is named

Classes

Classes are structures which can have virtual methods defined on them.

import basics
class Shape () {
constructor {}
virtual func getArea() float = 0.0
}
class Rectangle extends Shape (w, h float) {
constructor(w, h float){
this.w = w
this.h = h
}
override func getArea() float = this.w * this.h
}
func main {
shape *Shape = new Rectangle(5, 10)
defer delete shape
print(shape.getArea())
}

See classes for more information.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Structures · AdeptLanguage/Adept Wiki · GitHub
Skip to content

Structures

IsaacShelton edited this page Nov 16, 2022 · 3 revisions

Structures

Structures allow for multiple data types to be combined together

Declaration

Structures are declared by using the struct keyword followed by a list of fields.

struct Employee (name String, age int, productivity float)

Usage Example

import basics
struct Tree (age int, height int)
func main {
tree Tree
tree.age = 12
tree.height = 43
print("tree.age => " + tree.age)
print("tree.height => " + tree.height)
}
tree.age => 12
tree.height => 43

Reducing Redundancy

Sometimes when declaring structures, multiple fields in a row will have the same type repeated for each of them.

struct Person (firstname String, lastname String, occupation String)

When this is the case, you can omit all of the repeated types expect the final one in order to simplify the definition.

struct Person (firstname, lastname, occupation String)

Embedded Structures

Sometimes it's desired to share the same fields as another struct. In order to make this easier, you can include fields of an already defined structure into a new one using the struct keyword followed by the name of the structure.

struct Human (age int)
struct Citizen (struct Human, name String)
struct Doctor (struct Citizen, experience int, salary ulong)

If the included structure comes first in the field list, then the newly created structure will also be valid as the included structure when taken as a pointer and casted.

import basics
struct Point2D (x, y float)
struct Point3D (struct Point2D, z float)
func distanceToOrigin(p Point2D) float {
return sqrtf(p.x * p.x + p.y * p.y)
}
func main {
point Point3D
point.x = 3.0f
point.y = 4.0f
point.z = 2.0f
xy_distance float = distanceToOrigin(*cast *Point2D &point)
print("2D distance to origin => " + xy_distance)
}
2D distance to origin => 5.0

Structure Domains

Structure definitions can optionally be followed by a structure domain, in which all function declarations inside will be made into methods

import basics
struct Person (firstname, lastname String) {
func getFullname String {
return this.firstname + " " + this.lastname
}
}
func main {
person Person
person.firstname = "Isaac"
person.lastname = "Shelton"
print("Person's name is: " + person.getFullname())
}
Person's name is: Isaac Shelton

Packed Structures

By default, structures contain padding in order to improve access performance.

This can be disabled using the packed keyword.

packed struct MyFileHeader (magic ushort, version uint, offset1, offset2 usize)

Records

Records are structures that the compiler will automatically generate a constructor for.

Records are usually preferrable for holding data over regular structures.

record Person (firstname, lastname String, age int)
func main {
person Person = Person("Bekah", "Armstrong", 19)
printf("%S %S is %d years old\n", person.firstname, person.lastname, person.age)
}

See records for more information

Anonymous Structures

Structure types can also be used anonymously without a name

import basics
import math
func main {
point struct (x, y, z float)
point.x = 1.0f
point.y = 2.0f
point.z = 3.0f
printf("Distance to origin is %hf\n", distanceToOrigin(point))
}
func distanceToOrigin(p struct (x, y, z float)) float {
return sqrt(p.x * p.x + p.y * p.y + p.z * p.z)
}

In order for two anonymous structure types to be considered compatible, they must have the same fields and the same structural layout.

For example:

The types struct (x, y float) and struct (u, v float) are incompatible.

And also the types struct (a, b int) and struct (b, a int) are incompatible.

Anonymous Composite Fields

Structs and unions can be used as anonymous wrappers for fields.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)

In the above example, the type FloatOrIntVec3 has 7 fields, some of which overlap in memory:

  • is_floats
  • xf
  • yf
  • zf
  • xi
  • yi
  • zi

However there's an anonymous union of two anonymous structs, which are unnamed, so the names of the sub fields are promoted to be directly accessible from the next higher name scope.

Because of this, we can access members like xf directly instead of having to go through a field.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)
// Can access 'xf' via 'this.xf' where 'this' is a '*FloatOrIntVec3'
// since the union field is unnamed and also the struct field of type `struct (xf, xy, xz float)` is unnamed

versus

struct FloatOrIntVec3 (
is_floats bool,
data union (
float_info struct (xf, yf, zf float),
int_info struct (xi, yi, zi int)
)
)
// We have to access 'xf' via 'this.data.float_info.xf' (where 'this' is a '*FloatOrIntVec3')
// since the union field 'data' is named and also the struct field 'float_info' is named

Classes

Classes are structures which can have virtual methods defined on them.

import basics
class Shape () {
constructor {}
virtual func getArea() float = 0.0
}
class Rectangle extends Shape (w, h float) {
constructor(w, h float){
this.w = w
this.h = h
}
override func getArea() float = this.w * this.h
}
func main {
shape *Shape = new Rectangle(5, 10)
defer delete shape
print(shape.getArea())
}

See classes for more information.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Structures · AdeptLanguage/Adept Wiki · GitHub
Skip to content

Structures

IsaacShelton edited this page Nov 16, 2022 · 3 revisions

Structures

Structures allow for multiple data types to be combined together

Declaration

Structures are declared by using the struct keyword followed by a list of fields.

struct Employee (name String, age int, productivity float)

Usage Example

import basics
struct Tree (age int, height int)
func main {
tree Tree
tree.age = 12
tree.height = 43
print("tree.age => " + tree.age)
print("tree.height => " + tree.height)
}
tree.age => 12
tree.height => 43

Reducing Redundancy

Sometimes when declaring structures, multiple fields in a row will have the same type repeated for each of them.

struct Person (firstname String, lastname String, occupation String)

When this is the case, you can omit all of the repeated types expect the final one in order to simplify the definition.

struct Person (firstname, lastname, occupation String)

Embedded Structures

Sometimes it's desired to share the same fields as another struct. In order to make this easier, you can include fields of an already defined structure into a new one using the struct keyword followed by the name of the structure.

struct Human (age int)
struct Citizen (struct Human, name String)
struct Doctor (struct Citizen, experience int, salary ulong)

If the included structure comes first in the field list, then the newly created structure will also be valid as the included structure when taken as a pointer and casted.

import basics
struct Point2D (x, y float)
struct Point3D (struct Point2D, z float)
func distanceToOrigin(p Point2D) float {
return sqrtf(p.x * p.x + p.y * p.y)
}
func main {
point Point3D
point.x = 3.0f
point.y = 4.0f
point.z = 2.0f
xy_distance float = distanceToOrigin(*cast *Point2D &point)
print("2D distance to origin => " + xy_distance)
}
2D distance to origin => 5.0

Structure Domains

Structure definitions can optionally be followed by a structure domain, in which all function declarations inside will be made into methods

import basics
struct Person (firstname, lastname String) {
func getFullname String {
return this.firstname + " " + this.lastname
}
}
func main {
person Person
person.firstname = "Isaac"
person.lastname = "Shelton"
print("Person's name is: " + person.getFullname())
}
Person's name is: Isaac Shelton

Packed Structures

By default, structures contain padding in order to improve access performance.

This can be disabled using the packed keyword.

packed struct MyFileHeader (magic ushort, version uint, offset1, offset2 usize)

Records

Records are structures that the compiler will automatically generate a constructor for.

Records are usually preferrable for holding data over regular structures.

record Person (firstname, lastname String, age int)
func main {
person Person = Person("Bekah", "Armstrong", 19)
printf("%S %S is %d years old\n", person.firstname, person.lastname, person.age)
}

See records for more information

Anonymous Structures

Structure types can also be used anonymously without a name

import basics
import math
func main {
point struct (x, y, z float)
point.x = 1.0f
point.y = 2.0f
point.z = 3.0f
printf("Distance to origin is %hf\n", distanceToOrigin(point))
}
func distanceToOrigin(p struct (x, y, z float)) float {
return sqrt(p.x * p.x + p.y * p.y + p.z * p.z)
}

In order for two anonymous structure types to be considered compatible, they must have the same fields and the same structural layout.

For example:

The types struct (x, y float) and struct (u, v float) are incompatible.

And also the types struct (a, b int) and struct (b, a int) are incompatible.

Anonymous Composite Fields

Structs and unions can be used as anonymous wrappers for fields.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)

In the above example, the type FloatOrIntVec3 has 7 fields, some of which overlap in memory:

  • is_floats
  • xf
  • yf
  • zf
  • xi
  • yi
  • zi

However there's an anonymous union of two anonymous structs, which are unnamed, so the names of the sub fields are promoted to be directly accessible from the next higher name scope.

Because of this, we can access members like xf directly instead of having to go through a field.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)
// Can access 'xf' via 'this.xf' where 'this' is a '*FloatOrIntVec3'
// since the union field is unnamed and also the struct field of type `struct (xf, xy, xz float)` is unnamed

versus

struct FloatOrIntVec3 (
is_floats bool,
data union (
float_info struct (xf, yf, zf float),
int_info struct (xi, yi, zi int)
)
)
// We have to access 'xf' via 'this.data.float_info.xf' (where 'this' is a '*FloatOrIntVec3')
// since the union field 'data' is named and also the struct field 'float_info' is named

Classes

Classes are structures which can have virtual methods defined on them.

import basics
class Shape () {
constructor {}
virtual func getArea() float = 0.0
}
class Rectangle extends Shape (w, h float) {
constructor(w, h float){
this.w = w
this.h = h
}
override func getArea() float = this.w * this.h
}
func main {
shape *Shape = new Rectangle(5, 10)
defer delete shape
print(shape.getArea())
}

See classes for more information.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Structures · AdeptLanguage/Adept Wiki · GitHub
Skip to content

Structures

IsaacShelton edited this page Nov 16, 2022 · 3 revisions

Structures

Structures allow for multiple data types to be combined together

Declaration

Structures are declared by using the struct keyword followed by a list of fields.

struct Employee (name String, age int, productivity float)

Usage Example

import basics
struct Tree (age int, height int)
func main {
tree Tree
tree.age = 12
tree.height = 43
print("tree.age => " + tree.age)
print("tree.height => " + tree.height)
}
tree.age => 12
tree.height => 43

Reducing Redundancy

Sometimes when declaring structures, multiple fields in a row will have the same type repeated for each of them.

struct Person (firstname String, lastname String, occupation String)

When this is the case, you can omit all of the repeated types expect the final one in order to simplify the definition.

struct Person (firstname, lastname, occupation String)

Embedded Structures

Sometimes it's desired to share the same fields as another struct. In order to make this easier, you can include fields of an already defined structure into a new one using the struct keyword followed by the name of the structure.

struct Human (age int)
struct Citizen (struct Human, name String)
struct Doctor (struct Citizen, experience int, salary ulong)

If the included structure comes first in the field list, then the newly created structure will also be valid as the included structure when taken as a pointer and casted.

import basics
struct Point2D (x, y float)
struct Point3D (struct Point2D, z float)
func distanceToOrigin(p Point2D) float {
return sqrtf(p.x * p.x + p.y * p.y)
}
func main {
point Point3D
point.x = 3.0f
point.y = 4.0f
point.z = 2.0f
xy_distance float = distanceToOrigin(*cast *Point2D &point)
print("2D distance to origin => " + xy_distance)
}
2D distance to origin => 5.0

Structure Domains

Structure definitions can optionally be followed by a structure domain, in which all function declarations inside will be made into methods

import basics
struct Person (firstname, lastname String) {
func getFullname String {
return this.firstname + " " + this.lastname
}
}
func main {
person Person
person.firstname = "Isaac"
person.lastname = "Shelton"
print("Person's name is: " + person.getFullname())
}
Person's name is: Isaac Shelton

Packed Structures

By default, structures contain padding in order to improve access performance.

This can be disabled using the packed keyword.

packed struct MyFileHeader (magic ushort, version uint, offset1, offset2 usize)

Records

Records are structures that the compiler will automatically generate a constructor for.

Records are usually preferrable for holding data over regular structures.

record Person (firstname, lastname String, age int)
func main {
person Person = Person("Bekah", "Armstrong", 19)
printf("%S %S is %d years old\n", person.firstname, person.lastname, person.age)
}

See records for more information

Anonymous Structures

Structure types can also be used anonymously without a name

import basics
import math
func main {
point struct (x, y, z float)
point.x = 1.0f
point.y = 2.0f
point.z = 3.0f
printf("Distance to origin is %hf\n", distanceToOrigin(point))
}
func distanceToOrigin(p struct (x, y, z float)) float {
return sqrt(p.x * p.x + p.y * p.y + p.z * p.z)
}

In order for two anonymous structure types to be considered compatible, they must have the same fields and the same structural layout.

For example:

The types struct (x, y float) and struct (u, v float) are incompatible.

And also the types struct (a, b int) and struct (b, a int) are incompatible.

Anonymous Composite Fields

Structs and unions can be used as anonymous wrappers for fields.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)

In the above example, the type FloatOrIntVec3 has 7 fields, some of which overlap in memory:

  • is_floats
  • xf
  • yf
  • zf
  • xi
  • yi
  • zi

However there's an anonymous union of two anonymous structs, which are unnamed, so the names of the sub fields are promoted to be directly accessible from the next higher name scope.

Because of this, we can access members like xf directly instead of having to go through a field.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)
// Can access 'xf' via 'this.xf' where 'this' is a '*FloatOrIntVec3'
// since the union field is unnamed and also the struct field of type `struct (xf, xy, xz float)` is unnamed

versus

struct FloatOrIntVec3 (
is_floats bool,
data union (
float_info struct (xf, yf, zf float),
int_info struct (xi, yi, zi int)
)
)
// We have to access 'xf' via 'this.data.float_info.xf' (where 'this' is a '*FloatOrIntVec3')
// since the union field 'data' is named and also the struct field 'float_info' is named

Classes

Classes are structures which can have virtual methods defined on them.

import basics
class Shape () {
constructor {}
virtual func getArea() float = 0.0
}
class Rectangle extends Shape (w, h float) {
constructor(w, h float){
this.w = w
this.h = h
}
override func getArea() float = this.w * this.h
}
func main {
shape *Shape = new Rectangle(5, 10)
defer delete shape
print(shape.getArea())
}

See classes for more information.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Structures · AdeptLanguage/Adept Wiki · GitHub
Skip to content

Structures

IsaacShelton edited this page Nov 16, 2022 · 3 revisions

Structures

Structures allow for multiple data types to be combined together

Declaration

Structures are declared by using the struct keyword followed by a list of fields.

struct Employee (name String, age int, productivity float)

Usage Example

import basics
struct Tree (age int, height int)
func main {
tree Tree
tree.age = 12
tree.height = 43
print("tree.age => " + tree.age)
print("tree.height => " + tree.height)
}
tree.age => 12
tree.height => 43

Reducing Redundancy

Sometimes when declaring structures, multiple fields in a row will have the same type repeated for each of them.

struct Person (firstname String, lastname String, occupation String)

When this is the case, you can omit all of the repeated types expect the final one in order to simplify the definition.

struct Person (firstname, lastname, occupation String)

Embedded Structures

Sometimes it's desired to share the same fields as another struct. In order to make this easier, you can include fields of an already defined structure into a new one using the struct keyword followed by the name of the structure.

struct Human (age int)
struct Citizen (struct Human, name String)
struct Doctor (struct Citizen, experience int, salary ulong)

If the included structure comes first in the field list, then the newly created structure will also be valid as the included structure when taken as a pointer and casted.

import basics
struct Point2D (x, y float)
struct Point3D (struct Point2D, z float)
func distanceToOrigin(p Point2D) float {
return sqrtf(p.x * p.x + p.y * p.y)
}
func main {
point Point3D
point.x = 3.0f
point.y = 4.0f
point.z = 2.0f
xy_distance float = distanceToOrigin(*cast *Point2D &point)
print("2D distance to origin => " + xy_distance)
}
2D distance to origin => 5.0

Structure Domains

Structure definitions can optionally be followed by a structure domain, in which all function declarations inside will be made into methods

import basics
struct Person (firstname, lastname String) {
func getFullname String {
return this.firstname + " " + this.lastname
}
}
func main {
person Person
person.firstname = "Isaac"
person.lastname = "Shelton"
print("Person's name is: " + person.getFullname())
}
Person's name is: Isaac Shelton

Packed Structures

By default, structures contain padding in order to improve access performance.

This can be disabled using the packed keyword.

packed struct MyFileHeader (magic ushort, version uint, offset1, offset2 usize)

Records

Records are structures that the compiler will automatically generate a constructor for.

Records are usually preferrable for holding data over regular structures.

record Person (firstname, lastname String, age int)
func main {
person Person = Person("Bekah", "Armstrong", 19)
printf("%S %S is %d years old\n", person.firstname, person.lastname, person.age)
}

See records for more information

Anonymous Structures

Structure types can also be used anonymously without a name

import basics
import math
func main {
point struct (x, y, z float)
point.x = 1.0f
point.y = 2.0f
point.z = 3.0f
printf("Distance to origin is %hf\n", distanceToOrigin(point))
}
func distanceToOrigin(p struct (x, y, z float)) float {
return sqrt(p.x * p.x + p.y * p.y + p.z * p.z)
}

In order for two anonymous structure types to be considered compatible, they must have the same fields and the same structural layout.

For example:

The types struct (x, y float) and struct (u, v float) are incompatible.

And also the types struct (a, b int) and struct (b, a int) are incompatible.

Anonymous Composite Fields

Structs and unions can be used as anonymous wrappers for fields.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)

In the above example, the type FloatOrIntVec3 has 7 fields, some of which overlap in memory:

  • is_floats
  • xf
  • yf
  • zf
  • xi
  • yi
  • zi

However there's an anonymous union of two anonymous structs, which are unnamed, so the names of the sub fields are promoted to be directly accessible from the next higher name scope.

Because of this, we can access members like xf directly instead of having to go through a field.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)
// Can access 'xf' via 'this.xf' where 'this' is a '*FloatOrIntVec3'
// since the union field is unnamed and also the struct field of type `struct (xf, xy, xz float)` is unnamed

versus

struct FloatOrIntVec3 (
is_floats bool,
data union (
float_info struct (xf, yf, zf float),
int_info struct (xi, yi, zi int)
)
)
// We have to access 'xf' via 'this.data.float_info.xf' (where 'this' is a '*FloatOrIntVec3')
// since the union field 'data' is named and also the struct field 'float_info' is named

Classes

Classes are structures which can have virtual methods defined on them.

import basics
class Shape () {
constructor {}
virtual func getArea() float = 0.0
}
class Rectangle extends Shape (w, h float) {
constructor(w, h float){
this.w = w
this.h = h
}
override func getArea() float = this.w * this.h
}
func main {
shape *Shape = new Rectangle(5, 10)
defer delete shape
print(shape.getArea())
}

See classes for more information.

Clone this wiki locally

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Structures · AdeptLanguage/Adept Wiki · GitHub
Skip to content

Structures

IsaacShelton edited this page Nov 16, 2022 · 3 revisions

Structures

Structures allow for multiple data types to be combined together

Declaration

Structures are declared by using the struct keyword followed by a list of fields.

struct Employee (name String, age int, productivity float)

Usage Example

import basics
struct Tree (age int, height int)
func main {
tree Tree
tree.age = 12
tree.height = 43
print("tree.age => " + tree.age)
print("tree.height => " + tree.height)
}
tree.age => 12
tree.height => 43

Reducing Redundancy

Sometimes when declaring structures, multiple fields in a row will have the same type repeated for each of them.

struct Person (firstname String, lastname String, occupation String)

When this is the case, you can omit all of the repeated types expect the final one in order to simplify the definition.

struct Person (firstname, lastname, occupation String)

Embedded Structures

Sometimes it's desired to share the same fields as another struct. In order to make this easier, you can include fields of an already defined structure into a new one using the struct keyword followed by the name of the structure.

struct Human (age int)
struct Citizen (struct Human, name String)
struct Doctor (struct Citizen, experience int, salary ulong)

If the included structure comes first in the field list, then the newly created structure will also be valid as the included structure when taken as a pointer and casted.

import basics
struct Point2D (x, y float)
struct Point3D (struct Point2D, z float)
func distanceToOrigin(p Point2D) float {
return sqrtf(p.x * p.x + p.y * p.y)
}
func main {
point Point3D
point.x = 3.0f
point.y = 4.0f
point.z = 2.0f
xy_distance float = distanceToOrigin(*cast *Point2D &point)
print("2D distance to origin => " + xy_distance)
}
2D distance to origin => 5.0

Structure Domains

Structure definitions can optionally be followed by a structure domain, in which all function declarations inside will be made into methods

import basics
struct Person (firstname, lastname String) {
func getFullname String {
return this.firstname + " " + this.lastname
}
}
func main {
person Person
person.firstname = "Isaac"
person.lastname = "Shelton"
print("Person's name is: " + person.getFullname())
}
Person's name is: Isaac Shelton

Packed Structures

By default, structures contain padding in order to improve access performance.

This can be disabled using the packed keyword.

packed struct MyFileHeader (magic ushort, version uint, offset1, offset2 usize)

Records

Records are structures that the compiler will automatically generate a constructor for.

Records are usually preferrable for holding data over regular structures.

record Person (firstname, lastname String, age int)
func main {
person Person = Person("Bekah", "Armstrong", 19)
printf("%S %S is %d years old\n", person.firstname, person.lastname, person.age)
}

See records for more information

Anonymous Structures

Structure types can also be used anonymously without a name

import basics
import math
func main {
point struct (x, y, z float)
point.x = 1.0f
point.y = 2.0f
point.z = 3.0f
printf("Distance to origin is %hf\n", distanceToOrigin(point))
}
func distanceToOrigin(p struct (x, y, z float)) float {
return sqrt(p.x * p.x + p.y * p.y + p.z * p.z)
}

In order for two anonymous structure types to be considered compatible, they must have the same fields and the same structural layout.

For example:

The types struct (x, y float) and struct (u, v float) are incompatible.

And also the types struct (a, b int) and struct (b, a int) are incompatible.

Anonymous Composite Fields

Structs and unions can be used as anonymous wrappers for fields.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)

In the above example, the type FloatOrIntVec3 has 7 fields, some of which overlap in memory:

  • is_floats
  • xf
  • yf
  • zf
  • xi
  • yi
  • zi

However there's an anonymous union of two anonymous structs, which are unnamed, so the names of the sub fields are promoted to be directly accessible from the next higher name scope.

Because of this, we can access members like xf directly instead of having to go through a field.

struct FloatOrIntVec3 (
is_floats bool,
union (
struct (xf, yf, zf float),
struct (xi, yi, zi int)
)
)
// Can access 'xf' via 'this.xf' where 'this' is a '*FloatOrIntVec3'
// since the union field is unnamed and also the struct field of type `struct (xf, xy, xz float)` is unnamed

versus

struct FloatOrIntVec3 (
is_floats bool,
data union (
float_info struct (xf, yf, zf float),
int_info struct (xi, yi, zi int)
)
)
// We have to access 'xf' via 'this.data.float_info.xf' (where 'this' is a '*FloatOrIntVec3')
// since the union field 'data' is named and also the struct field 'float_info' is named

Classes

Classes are structures which can have virtual methods defined on them.

import basics
class Shape () {
constructor {}
virtual func getArea() float = 0.0
}
class Rectangle extends Shape (w, h float) {
constructor(w, h float){
this.w = w
this.h = h
}
override func getArea() float = this.w * this.h
}
func main {
shape *Shape = new Rectangle(5, 10)
defer delete shape
print(shape.getArea())
}

See classes for more information.

Clone this wiki locally