#🪅-progaming

1 messages · Page 84 of 1

fleet cedar
#

I don't like crate::parser::parser

hoary sluice
#

oh yeah idk why i dont have pub use for it

winged mantle
#

wait i am probably wrong

#

OH yeah

#

i am right

hoary sluice
#

but like is it preferred to do pub use parser::Parser in mod.rs or put the contents of parser.rs in mod.rs

winged mantle
#

you need to use pub mod to export the sibling modules

deep mulch
#

@hoary sluice 🦅ly

hoary sluice
#

yes but i dont know if mod.rs is meant to only house exports or if it can house the entire module

#

or a big part of the module

fleet cedar
#

It houses the contents of the module

winged mantle
#

sorry i was just getting confused

fleet cedar
#

What the module contains is up to you

hoary sluice
#

yes

winged mantle
#

you can have structs there i am pretty sure

#

and fns

hoary sluice
fleet cedar
#

Search your feelings

hoary sluice
#

my feelings are keep it in parser.rs but clippy whines about that so i was wondering if its convention to put it in mod.rs

fleet cedar
#

What does it say?

hoary sluice
#

tho i dont have mod foo { .. } twice

fleet cedar
#

You have a mod parser; inside a mod parser;

#

Which is indeed questionable

#

But if you want it that way, simply #[expect()] it

blazing haven
#

this is cool

dense sand
#

do yall know about any good website which would teach math for game dev? like i know what is matrix but how does relate to some position or shit in games, no clue

spring schooner
#

I don't really know of any (neither I have a ton of experience with matrixes), but you can view them as a generic tool for problem solving. Both CPUs and even more GPUs can do matrix calculations very fast, and in some cases this gives you a great advantage. An example is simple image filters, you can define a matrix that maps ARGB in to ARGB out for each pixel, and then any of those simple color filters can be applied using the same code instead of reimplementing the logic for each of them. At first it sounds like waste of computing power, but even for something as simple as a grayscale filter it's much faster

fleet cedar
#

In graphics they're mostly used for converting between coordinate spaces

valid jetty
#

@hoary sluice look at how easy it is to add new functions with C interop

valid jetty
#

lmao i just went down a massive rabbit hole

#

this is real debugging done by real software developers

hoary sluice
#

(one way)

hoary sluice
valid jetty
hoary sluice
#

why are you screaming at me 😢

valid jetty
#

3:

#

qbe is being annoying

hoary sluice
#

shouldve compiled to haskell

#
fac n = if n == 1 then 1 else fac (n-1) * n
fac 50

icypeas to haskell compiler for factorial functions in one line of python

for line in open(0): print(line, end='')
#

get it because its also valid haskell

valid jetty
#

😭

#

are your things lazy

hoary sluice
#

idk

#

i didnt explicitly implement it like that

#

it might be lazy by accident

#

i didnt implement multi arg call parsing and i have working multi arg parsing

#

so maybe the lazy evaluation also just happens

valid jetty
#

if i do

loopForever = loopForever
f x y = x
f 42 (loopForever)
``` do i get 42 or a hang
hoary sluice
#

you get 42

#

well you get expected expression but thats because functions require an argument

valid jetty
#

oh

#

ok well what if i do

#
loopForever a = loopForever a
f x y = x
f 42 (loopForever 0)
hoary sluice
#

stack overflow

#

however if you dont pass the 0 it for some reason compiles

#

well

#

interprets

#

idk why

#

oh yea cause loopForever by itself is a function so you just pass the function to f and it gets ignored

#

ok well ig tomorrow i make lazy eval

#

its not hard

hoary sluice
#

does it work on windows

#

i hope not

valid jetty
#

no ofc not

#

all of the stdlib is built on libc

hoary sluice
#

good

#

had to look up if scopes was the correct word for this but then i remembered that i dont actually care

valid jetty
#

lmaooo

valid jetty
#

or, if i forget, whenever theres a refactoring commit

#

as im not in 1.0 yet i can bump minor for breaking changes

#

if the change doesnt break past versions of the compiler but the change is significant enough i will bump patch

#

@hoary sluice look at how many import duplications im saving

#

each Module '...' is already imported. is an early return

hoary sluice
#

im saving a lot more duplicate imports by not having imports

deep mulch
#

WHY

fleet cedar
valid jetty
frosty obsidian
#

balala

valid jetty
#

yeah

deep mulch
#

balala

valid jetty
#

@hoary sluice do i allow constants to be defined on enums

#

on one hand

#

on the other hand

#

this isnt ambiguous

#

you can define functions on enums but the syntax is a little nicer for lambdas

#

for example

// なんちゃって型エイリアス
enum rune @repr(i32) @nofmt {}
const rune::__fmt__ = fn(rune self, i32 nesting) self.encode();
#

instead of

// なんちゃって型エイリアス
enum rune @repr(i32) @nofmt {}
fn rune::__fmt__(rune self, i32 nesting) { return self.encode(); }
#

its as simple as 1 comment

#

i can technically lie and do this which is honestly funnier

// なんちゃって型エイリアス
enum rune @repr(i32) @nofmt {}
external fn rune::encode(rune self) @alias(rune::__fmt__) -> string;
#

😭
$dbg("猫".utf8_decode());

hoary sluice
#

nah i just got to 17:30 and it gets crazy

royal nymph
native spruce
#

@woven mesa idk how im gonna do this but I wanna add a swipe gesture to my app that reveals a sidebar

#

sidebar would contain settings

woven mesa
native spruce
#

yk how the grok app does it

#

well just for chats

#

that but uikit

#

idk

woven mesa
native spruce
#

I kinda want

#

like

#

the whole app to shift right

#

would be neat

#

okay I should make the controller but with certain constraints so it matches a sidebar

#

pearto overengineering ui my beloved

valid jetty
deep mulch
#

@valid jetty @valid jetty @valid jetty @valid jetty

valid jetty
#

@deep mulch have you made any progress

median root
#

rofi pack theme too

deep mulch
#

can't until later

woven mesa
#

you drag to open and then move finger up or down whilst continually holding

#

let go to open selection

native spruce
#

yummy

valid jetty
#

why does she sound like furina

#

what the hell is this 😭

#

LMAO

#

WHAT THE FUCK AM I WATCHING

#

HOW DOES IT JUST GET WORSE AND WORSE

deep mulch
valid jetty
#

OH MY GOD

deep mulch
#

you should do it

#

@valid jetty @valid jetty @valid jetty @valid jetty @valid jetty

valid jetty
#

i dare you

deep mulch
#

I think I have a long time ago

#

@valid jetty you're so smart you probably turn spheres inside out in your mind

#

you can imagine every single step with visualization

#

@valid jetty probably solved some unsolved thousand year math problem

lavish cloud
#

@runic sundial do you also happen to know how to assimp? If I load all the meshes directly from scene.mMeshes they don't get the right materials, but for some reason building a scene tree from scene.rootNode down doesn't render anything at all for some of them

valid jetty
lavish cloud
#

wavefront atm

runic sundial
#

how are the materials annotated in the obj?

valid jetty
# valid jetty <@415132870252822539> <@289556910426816513> do this https://www.youtube.com/shor...

i did it in probably the simplest way possible in like 3 mins

use std/prelude;

struct Node {
    Node *left,
    Node *right,
    i32 value
}

fn Node::print_on_sep_lines(Node *self, i32[][] levels, i32 nesting) {
    while levels.len() < nesting + 1 {
        levels.push([i32;]);
    }

    levels[nesting].push(self.value);

    if left := self.left {
        left.print_on_sep_lines(levels, nesting + 1);
    }

    if right := self.right {
        right.print_on_sep_lines(levels, nesting + 1);
    }

    return levels.map<string>(fn(i32[] level) level.join(" ")).join("\n");
}

fn main() {
    root := Node {
        left = &Node {
            left = &Node {
                left = nil,
                right = nil,
                value = 4
            },
            right = nil,
            value = 2
        },
        right = &Node {
            left = &Node {
                left = nil,
                right = nil,
                value = 5
            },
            right = &Node {
                left = nil,
                right = nil,
                value = 6
            },
            value = 3
        },
        value = 1
    };

    $println(root.print_on_sep_lines([i32[];], 0));
}
``` surely its not *that* hard
lavish cloud
#

I know the obj is correct cuz online viewers handle it just fine

lavish cloud
runic sundial
#

How are you loading the file into assimp?

lavish cloud
#

    fun loadScene(path: String, target: GameObject) {
        val flags = Assimp.aiProcess_Triangulate or
                Assimp.aiProcess_GenSmoothNormals or
                Assimp.aiProcess_FlipUVs or
                Assimp.aiProcess_CalcTangentSpace or
                Assimp.aiProcess_JoinIdenticalVertices or
                Assimp.aiProcess_FindInvalidData

        val io = makeIO()
        val scene = Assimp.aiImportFileEx(path, flags, io)  ?: throw RuntimeException("Unable to load scene: ${Assimp.aiGetErrorString()}")
        println("Imported scene: $scene")
        io.OpenProc().close()
        io.CloseProc().close()

        // attempt at using the tree representation
        loadObject(scene.mRootNode()!!, scene, target)

        // Everything renders, but materials don't load 
//        if (scene.mNumMeshes() == 1) {
//            val meshRef = AIMesh.create(scene.mMeshes()!![0])
//
//            loadMesh(meshRef, scene, target)
//        } else {
//            for (meshIdx in 0 until scene.mNumMeshes()) {
//                val meshRef = AIMesh.create(scene.mMeshes()!![meshIdx])
//                val meshName = meshRef.mName().dataString()
//                val child = GameObject(meshName)
//                target.addChild(child)
//
//                loadMesh(meshRef, scene, child)
//            }
//        }

        scene.close()
    }
#

but the scene tree is also weird because a lot of objects are in there multiple times

#

sometimes standalone, sometimes as child of another part

runic sundial
#

I'm unsure if scene.rootNode would even work right with an obj

lavish cloud
#
private fun loadObject(node: AINode, scene: AIScene, target: GameObject) {
    println("${node.mName().dataString()} => [${node.mNumChildren()}, ${node.mNumMeshes()}]")

    if (node.mNumMeshes() == 1) {
        val meshRef = AIMesh.create(scene.mMeshes()!![0])
        loadMesh(meshRef, scene, target, null)
    } else {
        for (meshIdx in 0 until node.mNumMeshes()) {
            val meshRef = AIMesh.create(scene.mMeshes()!![meshIdx])
            val meshName = meshRef.mName().dataString()
            val child = GameObject(meshName)
            target.addChild(child)

            println("${node.mName().dataString()} => mesh $meshName")
            loadMesh(meshRef, scene, child, null)
        }
    }

    println("${node.mName().dataString()} => End meshes")

    for (childIdx in 0 until node.mNumChildren()) {
        val childRef = AINode.create(node.mChildren()!![childIdx])

        if (childRef.mNumMeshes() == 0 && childRef.mNumChildren() == 0) continue

        val childName = childRef.mName().dataString()
        val child = GameObject(childName)
        target.addChild(child)

        println("${node.mName().dataString()} => child $childName")
        loadObject(childRef, scene, child)
    }

    println("${node.mName().dataString()} => End children")
}
runic sundial
#

I believe it's more so for gltf/usd

lavish cloud
#

any suggestions on what to do then?

runic sundial
#

not too experienced with assimp, but I would validate that it even finds the mtl

#

assimp has an error message out iirc, might try malforming the mtl and seeing if it logs an error or not

#

Just to validate that it can find it

lavish cloud
#

I mean it can find it if I go through the scene root

#

just not if I loop over the meshes

runic sundial
#

Might be just how assimp is structuring the data internally, check their docs

#

or the rust docs of the assimp library lmaoo

#

Personally? I wouldn't bother with *.obj past simple demo meshes.

You should just make the jump straight into something like gltf or another more advanced format that assimp supports.

#

Obj is only really worthwhile if you need to "load a mesh quick and ez", past that it really sucks.

#

mostly because dealing with sub-meshes, materials, and additional vertex data with objs is a huge pain

fleet cedar
#

Obj is maybe easy, but it's definitely not quick

runic sundial
#

?

#

I mean quick to implement.

#

Not quick as in performant

fleet cedar
#

You'll want a binary format for quick

runic sundial
#

Define quick

#

You can make like a 100LoC Obj parser in nearly any lang from lua to c++

#

That's what I define as "quick and easy"

#

But yeah, binary *.glb/gltf files are way faster to load huge meshes with.

fleet cedar
#

And you can parse most formats in one line of cargo add

runic sundial
#

Didn't know cargo worked with Kotlin, will need to look into that

#

Most other formats also have "scenes" and some have pre-packed buffers you may need to decode or hope the library has utilities to do that with.

While objs are just verts and faces in a plain text file, easier for novices to deal with.

deep mulch
#

h

runic sundial
#

Obj as bootstrap, gltf as real deal

formal belfry
#

@woven mesa does @Observable have an equivalent to ObservableObject().objectWillChange

woven mesa
#

no

woven mesa
#

it works differently

#

no combine

#

(combine isnt on linux

#

@formal belfry use withObservationTracking

formal belfry
#

i couldnt figure out how that works

#

im just gonna get this working with combine first

woven mesa
woven mesa
#

idk what u working on tho

formal belfry
#

xrpc 2 electric boogaloo

woven mesa
#

does that mean i have to review a massive pull request

#

i will be prepared

formal belfry
#

i dont know if i even should pr this because its an entire rewrite

valid jetty
#

finally

woven mesa
formal belfry
#

I am being trolled so hard right now

#

this is so close to working but rpc just doesnt show up

#

@woven mesa fix

#

this code is so clean too bad it doesnt work

valid jetty
#

YESSS @hoary sluice its so real

#

theyre printed in the right order

formal belfry
#

I made a swordrpc wrapper months ago and it still holds up its so insanely clean

#

pohm y godasvbdhsda

signal oakBOT
formal belfry
#

huge okay

#

now time to want to die by simply using AXSwift

#

@woven mesa@woven mesa@woven mesa@woven mesa@woven mesa@woven mesa

shrewd canopy
deep mulch
valid jetty
valid jetty
#

Box<Option<Node>> holds an Option<Node> *, so as its a pointer its just l (a 64 bit int) and doesnt depend on anything

#

but Node depends on Box<Option<Node>> and Option<Node> depends on Node

#

so i had to write this thing to print them in the right order

#

(they wont be in the right order by default, the compiler doesnt guarantee that)

#

generic recursive structures

#

with pretty-printed types and stuff

fleet cedar
#

Why Box<Option<Node>> rather than Option<Box<Node>>

valid jetty
#

true actually

#

yeah that actually simplifies it quite a lot

#

because it can infer T for Option::None here now

#

absolute explosions

deep mulch
#

terrifying

#

@valid jetty now sleep after a long hard day of Elle work

#

Rosie would rather die than sleep

pseudo sierra
#

tbh mood

valid jetty
#

i just messed around and things worked out

#

who needs sleep anyway

deep mulch
digital plinth
#

Yo, any good way of fetching all users from servers to compare? Aka find overlap.

fleet cedar
shrewd canopy
#

otherwise no

digital plinth
#

yep. It is ripperoni

median root
#

If I have a user inputting an api key somewhere, what is the best way to store it so that you cant just access it anywhere and you need some kinda passwd? Like even if someone has my computer they cant just go onto the app and grab the key without a password or run around my file system to get it.

lavish frigate
#

store it in a file called IMPORTANT_API_KEY_DO_NOT_OPEN.txt on the users desktop

fleet cedar
#

Store it on the system keyring

median root
median root
#

so it asks for passwords whenever it is read from too?

#

ive only seen it used a few times on macos

fleet cedar
#

Linux itself does not, but both gnome and kde do

median root
fleet cedar
#

Check what other programs do

#

I've had to set an envvar to get python poetry to not crash from not having a keyring, so that probably supports it

median root
#

oh yippie more rust dependencies

#

just what I wanted in life

#

me when I get a new blazingly fast 🚀 memory safe 🦺 library for my birthday

#

I might just do the obvious option and encrypt the api key making use of the password hash from the user

#

and just store that encrypted thing in a file somewhere in sharedprefs

#

This looks pretty promising

#

AES-GCM

#

now to find a library that supports it

valid jetty
#

@hoary sluice i added tuple destructuring !!!!!!!!!!!!!!

#

a bfs hasnt looked this ergonomic in years

fn Node::print_on_lines(Node *self) {
    i32[][] levels = [];
    queue := [$(self, 0)];

    while !queue.is_empty() {
        node, level := queue.remove(0).unwrap();

        if levels.len() == level {
            levels.push([i32;]);
        }

        levels[level].push(node.value);

        if _, left := node.left {
            queue.push($(left.to_ptr(), level + 1));
        }

        if _, right := node.right {
            queue.push($(right.to_ptr(), level + 1));
        }
    }

    return levels
        .map<string>(fn(i32[] level) level.join(" "))
        .join("\n");
}
#

but yeah basically you can do this

#

the variables are assigned to x, y, z in the RHS, and its also an expression which evaluates to the LHS

#

for Option<T> and Result<T, E> the LHS is is_ok or is_some

#

which means you can write this

while _, current := lexer.next_token() {
    tokens.push(current);
}
lavish cloud
#

https://light-theme-hurts.my-ey.es/2pnb9xR.mp4
I figured out the issue
apparently despite opengl remembering everything all the time
it doesn't remember shader uniforms
so if I glUseProgram(a) and set uniforms, then go glUseProgram(b) and set uniforms, going back to glUseProgram(a) keeps the uniforms set on b

#

Now I just need to figure out why it's stuttering and why that weird artifacting happens on the side of the car

supple whale
#

why do i recoginise those menus

#

and why cant i remember what its from

valid jetty
#

imgui

#

lol

supple whale
#

sounds about right

#

its jsuch a genericly used lib everywhere

#

i think i first saw it for unity mods, then probs rtx remix the most often

#

its a workhorse and a half lol

chilly viper
#

ok uh

#

stupid question but

#

how did the person who made this put 2000 images of cheese into a slideshow

#

no way you do that by hand

fleet cedar
#

But however they did it they're a hero

chilly viper
fleet cedar
#

No

chilly viper
#

ok

placid horizon
#

is there a way to prevent Discord from automatically unmuting my mic whenever i join a VC?

winged mantle
#

if you picked 10 cheese a day it would take less than a year

#

I suppose ordering the cheese would be hard

#

wait

#

there's no way this video has 2000 cheese

#

you would need to show 10 cheeses a second for it to be 200 seconds

pseudo sierra
#

no that's 200 minutes

winged mantle
#

oh

#

i might be stupid

spark tiger
hoary sluice
#

however now u can actually do aoc purely in elle

#

@valid jetty is elle lazy evaluated

valid jetty
#

nop

valid jetty
hoary sluice
#

smh

valid jetty
#

it doesnt need to be ..???

#

its procedural

#

short circuiting things like && and || are lazy

#

or ?:

hoary sluice
valid jetty
#

i mean not really other than to implement

hoary sluice
#

like is there ever a scenario where youd rather evaluate strictly

valid jetty
#

i mean no but the implementation of it is pointless

fleet cedar
# hoary sluice but does it hurt

It makes implementation harder, costs more memory, costs a branch on every variable access, and makes it harder to reason about performance

lavish cloud
#

All in the kotlinx

fleet cedar
valid jetty
#

i didnt think about that

hoary sluice
winged mantle
valid jetty
#

why are recursive generic structures so fucking painful

#

like a ```rs
struct Node<T> {
Option<Box<Node<T>>> left,
Option<Box<Node<T>>> right,
T value
}

#

monomorphization for this is a nightmare

fleet cedar
#

How so?

valid jetty
#

because i have to define what Node<T> is before i know what Node<T> is

dense sand
#

make it Node<JS> please

fleet cedar
#

In rust that is solved by Box<T> being the size regardless of T (at least of T: Sized)

lavish cloud
valid jetty
#

i need to generate this struct in 2 passes

#

first pass, just collect the fields, so that I know what fields exist
second pass, partially monomorphize what I can

lavish cloud
valid jetty
#

but the problem is that, when trying to monomorphize Node<T>, it reaches the definition for Node<T> which is exactly the same as the current thing being monomorphized

#

so it just infinitely monomorphizes Node<T> causing a stack overflow

fleet cedar
#

How is that case different from non-generic recursive types?

lavish cloud
#

iirc it was something like

DataColumn<I, V> {
    withIndex(index: Index<A>): DataColumn<A, V>
}```
valid jetty
#

because non-generic types dont need to be partially monomorphized

#

a ```rs
struct Node {
Option<Box<Node>> left,
Option<Box<Node>> right,
i32 value
}

fleet cedar
#

I don't see why this would be a problem

valid jetty
#

while a ```rs
struct Node<T> {
Option<Box<Node<T>>> left,
Option<Box<Node<T>>> right,
T value
}

valid jetty
fleet cedar
#

What does partial monomorphization mean

valid jetty
#

if you have a ```rs
struct Bar<T> {
T x
}

struct Foo<T> {
Bar<T> x
}
``` when generating Foo<T>, you need to monomorphize Bar<T> with T, but you dont actually know what T is yet, so you have to partially monomorphize it into a non-generic structure that includes the generic T, that is then fixed up later when monomorphizing Foo<T> with some T

fleet cedar
#

I don't understand the "you need to monomorphize Bar<T>" part

valid jetty
#

its kinda hard to explain but its for cases like this

struct HashMap_Bucket<T, U> {
    T key,
    U value,
    bool full
}

struct HashMap<T, U> {
    HashMap_Bucket<T, U> *[] table,
    u64 size,
    u64 capacity
}
``` you know that the `Array<T>` struct holds a `HashMap_Bucket<T, U> *`, but you dont know what `T` and `U` are so you need to generate a partially generic struct `Array<HashMap_Bucket<T, U> *>`, which has a defined `T` being `HashMap_Bucket<T, U> *`, but that now depends on `T` and `U` being defined later
#

i probably could explain this better if i knew the theory lmao

#

i have no real way to explain it so, sorry if im making no sense

fleet cedar
#

Why are you trying to monomorphize things at all before you have the types

valid jetty
#

because Array<T> lives in a different context to HashMap_Bucket<T, U>

#

you know what the T for Array<T> is at all points, its HashMap_Bucket<T, U>

fleet cedar
#

??

valid jetty
#

hold on

valid jetty
#

.

valid jetty
#

^^^

fleet cedar
#

It's simply an invalid expression

#

Just like x is not a valid lambda calculus term, whereas \x. x is

valid jetty
#

i mean i get what you mean but you have to describe the relationship between (in this case) what Array<T>'s T is and what T is when monomorphizing HashMap<T, U>

#

because T means something different depending on the pass of monomorphization that youre on

fleet cedar
#

They are different variables in different scopes

#

There is no relationship

lavish cloud
valid jetty
#

no this does work

fleet cedar
#

Anyway, why are you monomorphizing types before the arguments are given

valid jetty
#

because im messing around and seeing what sticks lol

deep mulch
#

@valid jetty hiii

valid jetty
#

i didnt research into how youre actually supposed to monomorphize things

deep mulch
#

im eepy @valid jetty

#

rosie does not experience the feeling of eepy

valid jetty
#

sleep !!

deep mulch
#

nopp

#

too late for more eep

valid jetty
#

smh

winged mantle
#

i find it very funny running grep -r stackoverflow\.com node_modules

#

you can see all of the lib devs rely on stackoverflow as much as you

valid jetty
#

ok anyway whatever

#

@hoary sluice @deep mulch you can do all of this now

#

you can also use let syntax or specify a type and itll cast the variables to that type

deep mulch
#

i dont get it

#

youre redeclaring variables already in scope

valid jetty
#

thats just shadowing

#

lol

#

but i was talking about the destructuring

#

instead of ```rs
res := queue.remove(0).unwrap();
node := res.x;
level := res.y;

you just do
```rs
node, level := queue.remove(0).unwrap();
deep mulch
#

oh

#

no multi variable initializing like

#

x, y =: 0

#

?

valid jetty
#

you can do x := y := 0

#

you can define destructuring on any type by defining the __tuple__ and __triple__ methods

#
struct Foo {
    i32 a,
    string b,
    f32 c
}

fn Foo::__tuple__(Foo self) {
    return $(self.a, self.b);
}

fn Foo::__triple__(Foo self) {
    return $$(self.a, self.b, self.c);
}
a, b := Foo { a = 1, b = "a" };
a, b, c := Foo { a = 1, b = "a", c = 1.3 };
deep mulch
#

why not something like kotler and do a componentN N being the place

#

would allow for more than just 2

deep mulch
#

oh my god $$

#

rosie fix

valid jetty
fleet cedar
#

Why not just have __tuple__ return an arbitrary length tuple

royal nymph
#

@valid jetty

struct Baller {
  i32 foo,
  string bar
}

.foo, .bar = Baller { foo = 42, bar = "explode" }
#

add

valid jetty
deep mulch
#

struct Baller {
  i32 foo,
  string bar
}

val foo2: .foo, bar2: .bar = Baller { foo = 42, bar = "explode" }
valid jetty
#

ill do that along with getting rid of $ to initialize it

#

i do want to generalize the syntax

deep mulch
#

rename Elle to Rust and change logo to a Rust

fleet cedar
#

Tuple and triple is a very silly terminology at any rate, since a triple is a tuple

valid jetty
#

because the tuple type is (T, U), the triple type is Triple<T, U, V> the init function for a tuple is $(x, y), the init function for a triple is $$(x, y, z), and the destructuring syntax is x, y := z or x, y, z := w

#

its all over the place and i kinda hate it

royal nymph
deep mulch
#

you love

deep mulch
#

@valid jetty@valid jetty

fleet cedar
deep mulch
#

rosie doesnt know how to find and replace

valid jetty
#
interface Baller {
    foo: number,
    bar: string
};

const { foo: foo2, bar: bar2 } = { foo: 42, bar: "explode" } satisfies Baller;
``` @deep mulch
deep mulch
#

satisfies Baller; is ulgy

valid jetty
royal nymph
#

rosie is insane

deep mulch
#

rosie is insane

valid jetty
#

you do if you want it to have interfaces like in a strongly typed language

#

or make a class

#

but cl*sses

royal nymph
#

satisfies is like a cast but not a strong cast

valid jetty
#

yeah

fleet cedar
#

But interfaces suck though

#

I can list half a dozen ways traits are better

valid jetty
#

lmao

#

but this is typescript

#

everything kinda sucks

fleet cedar
#

True

deep mulch
#

ellescript

royal nymph
#
interface Thing {
  numberOfTimesItExploded: number
}

const someThing = { numberOfTimesItExploded: 42 };

const asThing = someThing as Thing;
const satisfiesThing = someThing satisfies Thing;
valid jetty
#

honestly speaking though, there hasnt ever been a time when i needed a tuple with more than 3 elements inside

royal nymph
#

satisfies is cool

valid jetty
#

if you need a tuple with more than 3 elements we have a tool for that: its called a struct

deep mulch
#

@valid jetty what about like

fleet cedar
#

If you see tuples bigger than that then either you want a named struct, or you're doing something very cursed like bevy or something

deep mulch
#

a use case of more than 3 would be colors

#

rgba

valid jetty
deep mulch
#
r, g, b, a := col;
valid jetty
#

thats why i havent had the incentive to make arbitrary named tuples

valid jetty
royal nymph
#

rosie will add iota keyword

deep mulch
valid jetty
#

which does what 😭

fleet cedar
deep mulch
#

you solve problems in your mind

valid jetty
#

i already have enums

deep mulch
#

a: .a, r: .r, g: .g, b: .b

royal nymph
#

idk why it's called iota

deep mulch
fleet cedar
valid jetty
deep mulch
deep mulch
valid jetty
royal nymph
deep mulch
#

@royal nymph

fleet cedar
deep mulch
#

V

valid jetty
#

in computer science its like "a small increment" because it goes up by 1 each time you reference it

#

thats why its called iota afaik

royal nymph
#

i mean

valid jetty
#

that too

deep mulch
frosty obsidian
deep mulch
#

if the dev cant read that the order is rgba thats their fault

fleet cedar
#
let Rgba { r, g, b, a } = col;
frosty obsidian
#

sometimes it is argb and that is annoying

valid jetty
deep mulch
fleet cedar
#

Argb is the correct one

deep mulch
#

CMYK

#

soon

frosty obsidian
#

i agree actually

#

consistently sized number

#

easier to do bitwise stuff

deep mulch
#

@frosty obsidian soon RGB will be replaced by CMYK

frosty obsidian
#

cmyk is terrible for anything other than printers

fleet cedar
#

ACMYK or go home

deep mulch
#

@frosty obsidian

valid jetty
#

contrast, meep, yellow, kontrast

#

oh cyan magenta yellow, key

#

i got it

#

why do they call it key just call it lightness

frosty obsidian
#

@deep mulch you forgot to rewrite pipette to use oklab

frosty obsidian
#

cmyk is subtractive

valid jetty
#

oh

deep mulch
#

would be weird

#

nothing uses OkLab pickers

#

except professional software

frosty obsidian
#

you'll be the first

deep mulch
#

never

frosty obsidian
#

you could be rich

deep mulch
#

how

fleet cedar
deep mulch
#

rgb

#

pantone

valid jetty
#

Black sky, black light

#

Black, everything black

#

Black heart, black keys, black diamonds

fleet cedar
#

Is that poetry

valid jetty
#

Blackout, black, everything black

#

no

deep mulch
#

@valid jetty@valid jetty@valid jetty@valid jetty@valid jetty

valid jetty
#

@deep mulch minklang

deep mulch
valid jetty
#

i think ill just push tuple destructuring like this, whatever

#

im not doing arbitrary-length tuples today

#

that will take forever

deep mulch
#

do

fleet cedar
#

Btw are you making elle and いちご just for fun or do they have any specific purpose

valid jetty
#

いちご is supposed to be a school project but its very overkill, so both are for fun

#

im learning a lot

#

hmm i just realized what having tuple destructuring means

#

thats cool

jagged cedar
#

why when i open the server this is the first thing i see

hoary sluice
deep mulch
#

variable length destructuring isn't a Kotlin specific thing

hoary sluice
#

componentN is kind of a meh solution

deep mulch
#

it's the only one I could think of

royal nymph
#

yes

#

kotlin destructuring is ass

hoary sluice
royal nymph
#

js has peak destructuring

hoary sluice
#

nop

royal nymph
#

yop

#

idk how anyone likes parameter order mattering for destructuring

#

it's so ass

hoary sluice
#

js is unequivocally terrible no matter where

lavish cloud
deep mulch
#

js only good for websites

hoary sluice
#

especially when the stdlib doesnt do more than component5

#

component(n) would be awesome i think

lavish cloud
#

component(n) would be slower

#

And also impossible to type correctly

hoary sluice
#

how about componentN and component(n) but componentN is preferred and the stdlib has up to component5 and then arbitrary component(n) (for collections)

deep mulch
#

what's the difference between componentN and component(n)

hoary sluice
#

or dont put it into a function and make an actual language construct for it

hoary sluice
deep mulch
#

I don't get it

hoary sluice
#

u can directly call componentN

#

u need a switch case in component(n)

deep mulch
#

wouldn't that be worse on performance

#

unless it can be inlined

lavish cloud
#

And you'd have to manually cast it to the correct type

lavish cloud
formal belfry
#

@woven mesa im making a proper swift rpc package

#

20 projects are already named SwiftRPC but im naming mine that

#

it won't use sockets so you can use it in a sandboxed app

shrewd canopy
ornate quiver
#

val [name, id] = data

#

has anyone noticed that different languages have a different "feel"
kinda like driving different cars
idk how to explain it idk if im just crazy

random maple
#

does vencord have that plugin where if u put over 2000 characters it splits it into multiple messages

ornate quiver
#

vns

elder yarrowBOT
formal belfry
#

its not public though

shrewd canopy
#

Whats not public

formal belfry
#

social sdk, you cant download it

#

need to sign up or something

winged mantle
#

blobcatcozy

// node does not currently support unit tests using typescript >:(

import { register } from "node:module";
import path from "node:path";
import { pathToFileURL } from "node:url";

register("@swc-node/register/esm", pathToFileURL(path.join(import.meta.dirname, "node_modules")));
shrewd canopy
shrewd canopy
#

just fill form in and they will automatically give access

formal belfry
#

o

winged mantle
#

they use it for --experimental-strip-types (which no longer needs a flag but ye) and --experimental-transform-types

#

but for some reason --test does not support it

#

(which is just a swc wrapper tbf)

hoary sluice
#

dude

#

my cat got hit by a car

valid jetty
#

what

#

youre joking right

hoary sluice
#

no

#

his paw got hit and his face was full of blood

#

we found him in a ditch at the side of the road

valid jetty
#

wtf :(

hoary sluice
#

wondering why he didnt come home today

valid jetty
#

i hope hes ok :c

hoary sluice
#

no hes dead

#

getting hit by a car at 9 years old was not how i was expecting him to die bro

valid jetty
#

nooooo :c

#

poor cat

hoary sluice
#

it was like 30m away from our house i dont understand why he got hit

#

its not like he was lost

#

weve had cats die before but this just hits different

#

ive known him for more than half my life

supple whale
#

not perfect when it comes to workers, but as good as it will get tbf

#

but when i want typescript with nodejs i usually jusst go for deno

#

because ts in nodejs is still cancer and has issues no matter what u try

supple whale
#

node's ts impl

winged mantle
#

it works fairly well

supple whale
#

its ass

#

doesnt work for dependencies which need to be in js not ts, its file extension handling is fucky and ignores tsconfig

winged mantle
#

it's unfinished and you need to pass a flag to actually transform but i think in the future it will be better

#

but for my case it works just fine

supple whale
#

for simple things its fine

#

problem is, TS is useless for small simple libs

#

TS is useful when you're doing complex shit, which is when node's ts impl starts to become problematic

winged mantle
#

it works just fine for me in my pretty complicated project - i don't expect that much lol

#

i don't expect it to typecheck

#

i dunno what the dependency issue is

#

most typescript options only have an effect on typechecking

#

i don't use jsx

supple whale
#

nah i mean raw ts

#

fuck tsx

#

react is a cancer XD

#

like for example

import lib from 'lib/src/main.ts'

wont work

#

so like, cool you can use TS, your deps cant

#

legit just deno index.ts

#

works better

winged mantle
#

well - that's just something it doesn't do - not a problem with what it does
every dependency that supports node.js will work just fine

#

I do see the annoyance if you have a monorepo and are depending on other internal packages

supple whale
#

did they finally fix import ./src/file.ts?

#

or was it ./src/file

winged mantle
#

wait whgar

supple whale
#

i dont remember one of them didint work

winged mantle
#

that's an esm thing you need extension

#

and you need explicit index.ts

#

unless the type stripping also requires that

#

but i'm using esm anyway blobcatcozystars

supple whale
#

yeah it ignores tsconfig

winged mantle
#

sericreatur i see

#

well

supple whale
#

yeah its defo not usable imho, i just wish deno was more widely supported in shit like android or electron or vscode

winged mantle
#

i just appreciate node somewhat catching up with other runtimes so i can just use what's familiar and stable and have nice stuff like that even if it's not quite on the same level blobcatcozystars

supple whale
#

so i could fucking ditch node

winged mantle
#

i don't really care about these problems

#

i just use esbuild or something else if i have to

supple whale
#

yeah, when i have no errors in my editor during dev, i want to have no errors at runtime

#

tsx is bae in that regard

#

like it just works

#

its insane to me how many alternatives to tsx there are there which just dont work

winged mantle
#

isn't it really sloow by default because it just uses tsc

supple whale
#

you run tsx and it magically works first try

winged mantle
#

ts𝕏

supple whale
#

nah it uses esbuild

winged mantle
#

i swear i used another library where it used tsc

supple whale
#

yeah there's one that uses import hooks

#

i mistakenly used it in prod one time

#

the memory usage and cpu usage on that shit was NUTS

winged mantle
#

wait

#

it must have been older version of tsx

supple whale
#

SA comes up to me like "yo your k8s instance is using like 2 gigs of ram for some simple script, wtf u doing"

winged mantle
#

???

#

i am confused

#

it does seem unlikely they would switch from tsc to esbuild

supple whale
#

node-ts/ts-node?

winged mantle
#

oh probably

supple whale
#

yeah that shit implodes RAM and CPU usage

winged mantle
#

yeaa

#

weird

supple whale
#

idk how it has 30 mil dls per week

winged mantle
#

i swear i copied the lib i was using from another project

supple whale
#

when its so bad

winged mantle
#

and that other project uses tsx

#

(until it was rewritten in rust just casually)

supple whale
#

ts-node uses tsc afaik

winged mantle
#

yeah it was totally that one

pearl stagBOT
supple whale
#

yeah i made that mistake once

#

it seems like a "good choice" because it has nice clean hooks into node

#

but nope, bad idea

frosty aurora
#

Hi

winged mantle
#

i feel i have come a long way since then even thought it was only a year ago

supple whale
#

yeah i've known ts for years, but only seriously started using it like a year ago

#

i still fucking hate typescript because of its insane per-project setup and god awful default settings

#

which is why i've put off using it for years

#

but its gotten better now

winged mantle
#

i was wanting to make a bot

#

i started with java

supple whale
#

XD

#

GG

winged mantle
#

then i used C++

#

then I used python

#

then i used rust

#

then i used typescript xD

#

(do NOT ask about C++)

supple whale
#

you procedurally used worse and worse languages for the job XD

winged mantle
#

i don't know why i considered c++

supple whale
#

rust had awful support for discord bots for ages, mainly because json and web and yeah

supple whale
#

i will never touch C/C++ for a personal project

#

its fucking hell

winged mantle
#

i think just because it had coroutine support

supple whale
#

i barely know any rust at all, and its so much better to compile and import dependencies its insane

#

like even with my utter incompetence in rust i still get the job done faster than in C/C++ because i can actually compile things and import dependencies and it just fucking works

#

FUCK MAKEFILE

winged mantle
supple whale
#

rate limits.... are a complex thing

#

like hardest things in programming

  1. naming shit
  2. caching
  3. rate limits
#

no cap.

#

buckets, bursts, refreshes, retries

#

its... hard as shit

winged mantle
#

oh there was also

#

the fact you couldn't set allowed mentions globally

winged mantle
#

that's probably fixed by now idk

#

can't remember

supple whale
#

sounds about right

winged mantle
#

poise is a pretty nice framework though and it uses serenity

supple whale
#

yeah libraries for web tech in non-web languages is usually 🐶💧

winged mantle
#

however i prefer to roll my own command handling stuff

#

things irk me i love how every command handler seems to say type .help command_name for wrong usage instead of having a button you can press
it's not that hard to make a button... this is not an unsolved computer science problem...

supple whale
#

also fuck tsc

winged mantle
#

idk that might not be entirely accurate

#

go rewrite 🚀

supple whale
#

it fucking scans node_modules deps which are in ts and errors build if they have ts-config incompatibilties

winged mantle
#

skipLibCheck

supple whale
#

nope

winged mantle
#

but supposedly that does bad things

supple whale
#

skipLibCheck doesnt help that

#

my node_modules deps themselves are in ts, and have their own tsconfigs

#

but tsc ignores them

#

and it uses the root tsconfig from my project

#

ignoring the scoped tsconfig in the dep

#

skipLibCheck doesnt work around that, because tsc NEEDS to compile that dependency, as its TS only, there's no JS code for it to import

winged mantle
#

unless you're not using node, libraries generally compile to a dist folder and only publish that

supple whale
#

yeah i'm not using node libs

winged mantle
#

my answer to everything just use node

#

😎

supple whale
#

cant run node in browser

#

:^)

winged mantle
#

oh fair

#

why do these libraries not contain the compiled ts though

supple whale
#

esbuild handles it correctly

#

but tsc which i use in my action hooks errors

#

it's gotten to the point where i use eslint for type checking because it fucking works better

winged mantle
#

shrimply get it to cd into every package and run tsc and rewrite the package.json to import from the output folder

supple whale
#

unironically that's the official solution

winged mantle
#

use jq in the github action

#

WHAT

supple whale
#

a script which adds // @ts-ignore at the start of every .ts file in node_modules

winged mantle
#

wait is jq read-only

#

dhfgj

#

unsane

supple whale
#

thats the current solution on tsc's github regarding the problem

winged mantle
#

i feel like some developers of big libraries are trolls they want to annoy people who open issues as much as possible

supple whale
#

its a ts problem not a tsc problem

winged mantle
#

isn't tsc part of ts

supple whale
#

right

#

i keep forgetting that

winged mantle
#

It is good that TypeScript errors here, even if it is an overall terrible user experience.

#

expert troll who managed to be employeed by microsoft /s

supple whale
#

yeah

#

this is legit why deno

#

it just works with ts dependencies no problem-o

winged mantle
#

i think if somebody opens an issue saying something is broken i should gaslight them into thinking they have problems

supple whale
winged mantle
#

and they should get a therapist

#

i will just close every issue from now on

#

"get a therapist"

supple whale
#

supposedly its tsc but without dep checking

winged mantle
#

in all seriousness honestly with issues like these i think there's usually some technical reason that's hard to understand

supple whale
#

it really is not

#

but eh

tawny umbra
#

I wonder if Lina is in a state now where I can submit to testflight hmmm

shrewd canopy
#

Whats Lina

tawny umbra
#

I accidentally posted it here but I guess it fits

#

App I'm making

reef whale
#

out of curiosity how different is react js to react native and what's the learning curve like trying to pickup react native if you already know react js

deep mulch
#

im biased but I highly recommend against it. it's buggy and performance isn't gonna be like a proper native framework
it's just not a good solution for multiplatform applications

shrewd canopy
lavish cloud
#

^

#

If you want something proper with a similar-ish API, give Compose a try.

hoary sluice
deep mulch
#

im jealous

supple whale
#

i want one for svelte ngl

valid jetty
deep mulch
#

@rosie.pie hiiiii

#

@valid jetty

spark tiger
supple whale
#

would it even sell?

#

its kotlin...

deep mulch
#

silence

#

id buy

#

not for $500

royal nymph
#

buy for 100$ @deep mulch

deep mulch
spark tiger
supple whale
#

looks at furry community... fair....

valid jetty
#

i don’t even pay for my software why would i pay for merch

#

i would much rather spend the money on 地雷系

supple whale
#

mfw man is talking to himself

spark tiger
#

i would spend all my income on an extremely rare and pretty piece of clothing for $2000 ngl

#

yall would not..?

supple whale
#

my limit is $100 or $150 for a single piece of merch

fleet cedar
#

I would not spend $2000 for a tshirt

valid jetty
#

exactly

spark tiger
#

still can’t believe ts is real 😭😭😭

deep mulch
spark tiger
fleet cedar
#

Who the would pay $878 for that

deep mulch
#

me

fleet cedar
#

Looking at a random clothes store's website, I could buy 125 tshirts for that money

royal sphinx
#

How to increase the size of server icons?

elder yarrowBOT
spark tiger
runic sundial
#

Vro sounds like a rich kid

spark tiger
runic sundial
#

Then what the hell are you on about

#

Who pays more than like

#

20 dollars for a shirt ever

#

Better be a fucking golden shirt

spark tiger
#

i’m saying if i was earning shit i would consider paying that much for a tee if i fw sm

runic sundial
#

But have u considered how much ice cream you could buy instead

#

Or frozen pizzer

spark tiger
#

bro fuck ice cream u can’t rock dat

runic sundial
#

I can eat it

#

I want ice cream now

#

Accept my apolocheese for the outburst

#

I will now investigate the viability of ice-cream

spark tiger
#

u gon b sick from that much ice cream

runic sundial
#

I only want like a scoop

#

But the idea is that you can always get a scoop

#

And if you can control yourself

spark tiger
#

or a t shirt

runic sundial
#

It is good

spark tiger
#

need 😭😭😭

fleet cedar
spark tiger
#

I KNEW SOMEONE WOUKD SAY THAT

#

it’s at 13% it’s gonna be fine

valid jetty
#

@hoary sluice @deep mulch @placid cape I DID IT

#

I ACHIEVED PEAK

#
fn Array::map_with<T, U, V>(T[] self, fn(T, V, u64, T[]) -> U mapping, V arg) -> U[] {
    let new_self = Array::with_capacity<U>(self.len());

    for u64 i = 0; i < self.len(); i += 1 {
        new_self.push(mapping(self[i], arg, i, self));
    }

    return new_self;
}

fn Array::map<T, U>(T[] self, fn(T, u64, T[]) -> U mapping) -> U[] {
    let new_self = Array::with_capacity<U>(self.len());

    for u64 i = 0; i < self.len(); i += 1 {
        new_self.push(mapping(self[i], i, self));
    }

    return new_self;
}
#

STRONGLY TYPED FUNCTION SIGNATURES IN THE TYPE SYSTEM

#

!!!!!!!!!!!!!!!!!!!!!!!

winged mantle
#

i tried shortening it but it made it longer

valid jetty
#

wtf am i looking at

valid jetty
winged mantle
deep mulch
#

too much self

#

why can't self just be implicitly an argument

#

developer shouldn't have to always specify it as the first arg

#

I think it would be easier

#

@valid jetty @valid jetty

valid jetty
fleet cedar
#

Decades of experience with c++ and java have learned that explicit self is better

valid jetty
#

^^^

deep mulch
#

does this support non local functions too@valid jetty

valid jetty
#

wdym

deep mulch
#

map(someFn)

valid jetty
#

yes you can pass any function to it

#
fn Array::truncate(i64[] self) {
    return self.map(i64::truncate);
}

fn Array::promote(i32[] self) {
    return self.map(i32::promote);
}
#

as long as it has a signature and isnt just a void* or something

deep mulch
#
fn Array::truncate() {
    return self.map(i64::truncate);
}

fn Array::promote() {
    return self.map(i32::promote);
}
``` fixed
winged mantle
#

how do ints have functions

#

scary..

valid jetty
fleet cedar
valid jetty
#

it sounds cursed but it is actually really really powerful

deep mulch
#

@valid jetty can function be defined on null

valid jetty
#

because you can do stuff like this

global pub, external;

fn isalnum(char arg) @alias(char::is_alphanumeric) -> bool;
fn isalpha(char arg) @alias(char::is_alphabetic) -> bool;
fn iscntrl(char arg) @alias(char::is_control) -> bool;
fn isdigit(char arg) @alias(char::is_digit) -> bool;
fn isgraph(char arg) @alias(char::is_graphic) -> bool;
fn islower(char arg) @alias(char::is_lowercase) -> bool;
fn isupper(char arg) @alias(char::is_uppercase)-> bool;
fn isprint(char arg) @alias(char::is_printable) -> bool;
fn ispunct(char arg) @alias(char::is_punctuation) -> bool;
fn isspace(char arg) @alias(char::is_whitespace) -> bool;
fn isxdigit(char arg) @alias(char::is_hexdigit) -> bool;
fn tolower(char arg) @alias(char::to_lowercase) -> bool;
fn toupper(char arg) @alias(char::to_uppercase) -> bool;
'a'.is_digit()
``` and this is a 0 cost abstraction which, in the IR, literally just does `isdigit('a')`
valid jetty
#

nil is a void*

deep mulch
#

I null

winged mantle
valid jetty
#

well

deep mulch
#

can you declare function on void*

valid jetty
#

it calls into crt

winged mantle
#

in rust can you call functions on ints idk

valid jetty
#

yes ofc

winged mantle
#

probably

valid jetty
#

that being __void_ptr__ and __ptr__

#
fn __void_ptr__::__fmt__(void *self, i32 nesting) {
    return "<unknown at {}>".__internal_formatter_do_not_use_unless_you_know_what_youre_doing__(self);
}
#
!external fn __ptr__::__fmt__<T>(T *self, i32 nesting) {
    let res = "invalid";

    if #cast(bool, self) && #cast(void *, self) % #size(void *) == 0 {
        res = (*self).__fmt__(nesting);
    }

    return "<{} at {}>".__internal_formatter_do_not_use_unless_you_know_what_youre_doing__(res, self);
}
winged mantle
#

stop putting functions on primitives
ints were never meant to be .toStringed

valid jetty
#

ugly but it doesnt need to be pretty

deep mulch
#

Rosie will add proper visibility modifiers and remove __

valid jetty
#

its an internal function

deep mulch
#

@valid jetty tomorrow Elle will be released

fleet cedar
spark tiger
valid jetty
#

its useful to have methods on ints

#

and any type in general

winged mantle
#

more like sub_without_overflow?

fleet cedar
#

The less special primitives are, the better

valid jetty
#

✨ saturating_sub ✨

#

yeah ^^

deep mulch
#
private fn voidptr::fmt(i32 nesting) {
    return "<unknown at {}>".format(self)
} 
#

fixed

#

wait

winged mantle
#

i think there's a good argument to not allow operator overloading and only make primitives have them

deep mulch
#
private fn voidptr::fmt(i32 nesting) {
    return "<unknown at ${self}>"
} 
#

fixed

winged mantle
#

but i understand why people like operator overloading

fleet cedar
deep mulch
#

or something

winged mantle
#

compromise: make everything use awkward methods

#

5.times(10)

valid jetty
#

thank you rust

deep mulch
#

@valid jetty do you love my ideas

fleet cedar
deep mulch
#

one day I will just rewrite Elle in Kotlin

valid jetty
winged mantle
#

😭

#

allow doing not like in c++

#

/run

#include <iostream>
if (not false)
    std::cout << "hi\n";
rugged berryBOT
#

Here is your c++(10.2.0) output @winged mantle

hi
valid jetty
#

oh actually

#

you did times like *

deep mulch
#

I'll make Elle feature complete in Kotlin before you finish Elle @valid jetty

valid jetty
#

i was thinking of the other times

winged mantle
#

what like 5555555555

#

5.repeat(10)

deep mulch
#

@valid jetty make compose in elle

valid jetty
#

i was thinking of this other example

winged mantle
#

make ellex

valid jetty
#

which is honestly funnier

winged mantle
#

@valid jetty like jsx but for elle

valid jetty
#

evil

winged mantle
#

is it weird that i named a file wish_dot_com

deep mulch
#

@valid jetty Elle will support this (syntax
(5.mi + 3.km) / 10.sec

winged mantle
#

imagine if you add units to primatives

#

print((5 miles).unit) // miles

#

print(typeof(5 miles)) // int

#

where it's still the same type

deep mulch
#

infix getters would be funny

winged mantle
#

infix is kinda clean

deep mulch
#

yes

winged mantle
#

/run

println 'hi'
rugged berryBOT
#

Here is your groovy(3.0.7) output @winged mantle

hi
deep mulch
#

I like as long as it's not abused too much

winged mantle
#

why don't languages have a print operator if printing is used so much like
🖨️"hello world"

#

why husk

#

get special programming keyboard

#

all necessary symbols

#

why don't programming languages add support for exporting with tarrifs

deep mulch
#

5 mi / 3 hr // mph
9.8 m / 1 sec ^ 2 // m/s²

valid jetty
#

f# has this

#

its so cursed

winged mantle
#

i don't understand why you need units lioke that

deep mulch
#

@valid jetty Elle repl

winged mantle
#

just do 5 * MILES