#development

1 messages · Page 173 of 1

placid kraken
#

smh

gentle grove
#

i mean you're not gonna stop people

#

If you do that then they'll just spam text instead

#

have fun validating that

#

(you should not)

hasty ruin
gentle grove
#

require state ID to register

radiant idol
#

@placid kraken i think this should work

placid kraken
reef trail
#

instead of duplicating the method call

brazen timber
#

aight whos name has numbers

#

the others i understand

placid kraken
#

rosie8 4real

faint stag
tawdry trench
ashen birch
#

she zef on my ram until im brick

acoustic imp
ashen birch
#

i knew i made a banger

placid kraken
#

I GOT IT TO COMPILE

#
op add(Int arg1, Int arg2) {
    ret arg1 + arg2;
}

pub op main() {
    let res: Int = add(10, 20);
    printf("We got %d. Yay!\n", res);
}
data $main.0 = { b "We got %d. Yay!\n", b 0 }

function w $add(w %arg1, w %arg2) {
@start
    %r_v =w add %arg1, %arg2
    ret %r_v
}

export function w $main() {
@start
    %res =w call $add(w 10, w 20)
    call $printf(l $main.0, ..., w %res)
    ret 0
}
ashen birch
#

this is like worse assembly

#

how do u manage to do that

placid kraken
#

its not that bad because its all documented

indigo peak
ashen birch
#

it’s capt hate we’re on the same team here

placid kraken
#

ok so now ALL of this compiles

op modulusWithTwo(Int num) {
    ret num % 2;
}

op add(Int num1, Int num2) {
    ret num1 + num2;
}

pub op main() {
    let addition: Int = add(4, 5);
    let remainder: Int = modulusWithTwo(addition);

    let summed: Int = add(addition, remainder);

    printf("The result is %d\n", summed);
}
#
data $main.0 = { b "The result is %d\n", b 0 }
function w $modulusWithTwo(w %num) {
@start
    %r_v =w rem %num, 2
    ret %r_v
}
function w $add(w %num1, w %num2) {
@start
    %r_v =w add %num1, %num2
    ret %r_v
}
export function w $main() {
@start
    %addition =w call $add(w 4, w 5)
    %remainder =w call $modulusWithTwo(w %addition)
    %summed =w call $add(w %addition, w %remainder)
    call $printf(l $main.0, ..., w %summed)
    ret 0
}
#
$ The result is 10
#

real

#

this is so fun!!

#

the way that it holds literal expressions isnt the best but thats just how qbe works

#

first i define a global vector of globals

pub struct Global {
    pub name: String,
    pub value: String,
    pub public: bool,
}

lazy_static! {
    pub static ref GLOBALS: Mutex<Vec<Global>> = Mutex::new(Vec::new());
}

all constants will go into this pool, aswell as literals

#

and that matches here

Primitive::Constant {
    name,
    public,
    r#type,
    value,
} => {
    let parsed_value = match value {
        ValueKind::String(value) => format!("\"{}\"", value),
        ValueKind::Number(value) => format!("{}", value),
        ValueKind::Character(value) => format!("\"{}\"", value),
        ValueKind::Nil => "0".to_string(),
    };

    let mut globals = GLOBALS.lock().unwrap();
    globals.push(Global {
        name: name.to_string(),
        value: parsed_value,
        public: public.clone(),
    });
}
radiant idol
#

yk

#

that match thing is kinda growing on me

#

it does look interesting

placid kraken
#

lmao yeah its great

placid kraken
#

ok yes hello world successful

#
pub op main() {
    puts("Hello world!\n");
}
#

this is what it compile to ```ts
data $main.0 = { b "Hello world!\n", b 0 }
export function w $main() {
@start
call $puts(l $main.0)
ret 0
}

#

and this is the assembly that produces

.data
.balign 8
_main.0:
    .ascii "Hello world!\n"
    .byte 0
/* end data */

.text
.balign 4
.globl _main
_main:
    stp    x29, x30, [sp, -16]!
    mov    x29, sp
    adrp    x0, _main.0@page
    add    x0, x0, _main.0@pageoff
    bl    _puts
    mov    w0, #0
    ldp    x29, x30, [sp], 16
    ret
/* end function main */
steady nest
#

no wonder your code bootloops

hasty ruin
#

.

placid kraken
#

LMAO

queen ruin
#

What were you doing scrolling through 8 month old discord chats?

keen moon
#

what status bar theme is that

lean ermine
#

the vpn icon i got from icons8 though

keen moon
#

literally the only good nicebarx theme ive ever seen

#

good shit

lean ermine
#

lol thx

#

yeah most of the nicebarx themes are stupidly cluttered for no reason lol

keen moon
lean ermine
#

fr lol

keen moon
#

:3

steady nest
queen ruin
primal perch
#

who

young meteor
queen ruin
opal hazel
#

Can anyone here teach me how to install theos?

#

I’ve downloaded it and I double click it but it doesn’t work

radiant idol
#

run it as administrator

opal hazel
#

How

radiant idol
#

right click then press run as administrator

#

totally will work

opal hazel
#

I tried that

radiant idol
#

oh

opal hazel
#

But I’m running an old version of Ubuntu I think

radiant idol
#

wait are you being sarcastic

#

lmao

#

im confused

kind herald
#

Hi sparkdev

indigo peak
#

i think spark knows how to install theos but i could be wrong hm

radiant idol
#

i thought he was being sarcastic at first

#

but now idk

opal hazel
#

What’s theos?

radiant idol
#

its uh

kind herald
#

that one guy

indigo peak
radiant idol
#

apparently this

indigo peak
#

theOS

kind herald
#

didn’t he make the samsung

opal hazel
#

Hmm

indigo peak
#

only os you'd ever need

radiant idol
#

fioreware

opal hazel
#

I’m just doing my rare r/jb trolling

radiant idol
#

go fix snowboard or something smh

indigo peak
radiant idol
#

jkjk

opal hazel
#

You fix snowboard

#

It’s open source

indigo peak
#

release the source

radiant idol
#

better not be mediafire

#

or else

indigo peak
#

wait its actually open sourced

#

what

opal hazel
#

It’s open source if you have access to my MacBook

indigo peak
#

not really that open now is it

indigo peak
velvet path
#

brb hacking SparkDev's MacBook

opal hazel
#

Pls no

kind herald
#

what does this mean Did sparkdev hack my unc0ver

opal hazel
#

Who is SparkDev

#

What an idiot

indigo peak
#

idk i only know NotSparkDev

opal hazel
#

Imagine using syslog

indigo peak
#

me n all my homies write to a .txt file in documents instead of NSLog

restive ether
opal hazel
#

How do I make a .tx file

radiant idol
#

um

opal hazel
restive ether
#

:mhm

#

wtf

#

this app sucks

#

so broke

opal hazel
#

ban cameren fr

restive ether
restive ether
radiant idol
#

im going to delete this before icraze sees it

kind herald
#

?

opal hazel
#

touch cameren.uwu

kind herald
#

?

indigo peak
lean ermine
#

who is icraze

opal hazel
#

@indigo peak ur in trouble now

indigo peak
#

nuh uh

opal hazel
#

Fair enough

#

You said nuh uh

indigo peak
#

your honor, nuh uh

opal hazel
#

Right that’s my rare r/jb trolling done

#

Goodbye all

kind herald
#

fioreware

kind herald
opal hazel
#

🫡

radiant idol
#

spark will now proceed to jump into his hidey hole of no contact for 15 years until he comes back on r/jb

kind herald
#

shorten the hole of no contact to 2 days by pinging him 36 times

radiant idol
#

mods this user is encouraging useless pings

kind herald
#

you made jade

#

so

radiant idol
#

so

#

w?

radiant idol
#

even though im on macOS

radiant idol
#

phew

#

you better not have seen it

kind herald
#

icraze message logger

lean ermine
radiant idol
#

shush

#

nerd

acoustic imp
#

guys do u know shakespear

#

specifally romeo and Juliet

#

i need help developing my evidence

kind herald
#

chat gpt

acoustic imp
#

YOUR RIGHT

lean ermine
queen ruin
queen ruin
acoustic imp
#

indeed

#

chat gpt is him

queen ruin
acoustic imp
#

jus needed scenes that support my claim

timid furnace
#

idk dawg i dont do stupid shit like this

#

best guess is mount ddi with pymobiledevice3 or something

lean ermine
#

lol

#

owned

primal perch
#

update to sonoma @grave sparrow

#

Darwin mac-pro.lan 23.4.0 Darwin Kernel Version 23.4.0: Fri Mar 15 00:11:05 PDT 2024; root:xnu-10063.101.17~1/RELEASE_X86_64 x86_64

#

DARWIN 23

queen ruin
#

Captinc secretly loves swift

faint timber
primal perch
#

we love assembly

native orbit
#

we love arm64 assembly*

primal perch
#

true assembly enjoyers transcended isa

gentle grove
#

we love lean manufacturing

gentle grove
#

lean manufacturing as in the thing toyota invented

primal perch
#

:/

torn oriole
placid kraken
#

tsoding 🔥

#

writing erlang code in emacs

granite frigate
#

guys i know what tweak to make now after a few days on android

#

universal back gesture

#

that shit is a godsend wtf

wooden yarrow
#

android on ios

ashen birch
granite frigate
#

nah

#

i cant swipe back on youtube to go back

#

it's down for no reason

#

i cant swipe back on the cc

golden hare
#

I can gift you nexus, if would be kind enough to gift me bloom

hasty ruin
placid kraken
#

horror

#

qbe ir is so weird

#

i can’t pass locally scoped variables to functions but i also can’t store strings with % sigil functions i need to store them as data sections

#

THEN i also can’t denote a return type for ret

#

so while everything else follows with the type (w, l, d, etc) returning doesn’t have a return type

#

i also can’t seem to figure out how to get the memory address of a variable so i can get scanf working

#

so yay .,,,,

#

oh and not to mention i can’t pass a data section to a % sigil variable and then use that variable in place of a data section

golden hare
#

me?

cloud yacht
native dune
#

nvim

cloud yacht
#

Tbh I've been meaning to learn nvim

native dune
#

its ez

cloud yacht
#

Yeah I've been mostly busy with school and didnt have a lot of time

granite frigate
#

how tf am i supposed to remember that like ce is to change to the end of the word or r to replace or whatever

native dune
#

i dont remember allat

#

i use it as a normal text editor

sonic totem
#

Who thought to substitute localisations to l10ns

placid kraken
granite frigate
#

:idk:

placid kraken
#

@slender glade

gentle grove
#

muscle@memory

gentle grove
placid kraken
#

yes

placid kraken
#

i just realised that add operations in elle can be nested and add operations in qbe must be 2 integers only

#

so thats fun i guess

lean ermine
#

vim haters when someone is holding a gun to their head and asking what the most efficient text editor is

reef trail
reef trail
#

(i’m a vim user)

#

ew

#

who actually uses xcode

#

vim motions != vim

#

if you’re not using vim motions you’re a shit dev

lean ermine
#

anyone know if this guy was spitting out of his ass or if this is true

#

i guess in the grand scheme of things no it does not

young meteor
#

use a good os then

reef trail
placid kraken
#

zed, vscode, nvim

young meteor
#

linux and windows > macos (no zefram malware)

placid kraken
#

you have options

acoustic imp
#

what are you using instead of VScode ?

primal perch
#

enjoy coping with shitcode then

#

vscode is heat

#

gexcode

acoustic imp
#

but like what else is there ??

#

ohh shitcode is a real thing

hexed knot
#

vscode is good

acoustic imp
#

ohoh

hexed knot
#

appcode has no reason to exist

#

its just xcode but slow and less features

reef trail
#

neovim does everything an ide does when setup

#

for some people they don’t want to have their own edition, me personally i find it amazing being able to configure every aspect of it and tune it to how i want to work

#

if you’re saying vscode is an ide so is neovim, vscode does shit all without extensions

gentle grove
#

debugger plug-ins in vim

#

you have to have plugins to use the vscode debugger too

#

does vscode have that

#

yes

#

Yes if you add a plug-in

#

thought you were talking about vscode?

#

ok but nobody normal uses makefiles as a "build system"

hexed knot
#

yeah

#

its 2024

#

cmake usually

#

apparently ninjas good

#

but ive never used it so i cant comment

reef trail
#

DAP

#

Telescope

#

Fugitive

#

not something your editor should be doing

hexed knot
#

this dude really thinks neither vscode (the most popular text editor with extensions made by microsoft) nor neovim (the most popular cli text editor with extensions) have extensions for git (the largest git website is made by microsoft)

reef trail
#

lmao

hexed knot
#

also

reef trail
#

I get why ppl like prebuilt IDEs but i find them bloated and cumbersome, i love the modular style of building your own editor

hexed knot
#

less work

reef trail
#

and using a different ide for each language you use sounds like pain

reef trail
hexed knot
#

i used to use jetbrains

reef trail
#

my neovim config didn’t take long to build up at all

hexed knot
#

and its nice u know u get that true power of your ide using half your ram

#

on the start menu

reef trail
#

and not ideal for an individual

#

it feels weird to me

hexed knot
#

idk what u mean

reef trail
#

and it being proprietary is a turn off

hexed knot
#

idrc abt that stuff so

vivid dew
#

(he is a hipster)

reef trail
#

who’s the hipster

hexed knot
#

joe

reef trail
#

if i can’t hack it i won’t use it lol

hexed knot
#

to each they own my brother

#

in the end we will still stroke

reef trail
#

real

faint timber
#

⨯ kernelcache type is not MH_FILESET (KEXT-xtraction not supported yet)
ok whats the tried and true kextractor for non fileset 16.x kernels?

shrewd moth
#

Somebody knows wtf is this? I get it on every package I install

hasty ruin
#

Do you have a tweak called FLXX

#

Or something with those initials

shrewd moth
acoustic imp
#

Go look for one

shrewd moth
#

I did

#

Closest thing I found is flex?

acoustic imp
#

What flex do you have ? From where

shrewd moth
#

looks like removing it solved it idk wtf was the issue

faint lionBOT
#

You have sent a link to a package, you can use the buttons below to open it directly in your preferred package manager.

acoustic imp
#

I probly have a bad version of flex

#

Yea

#

U got it from somewhere “bad” lol

shrewd moth
#

:/

#

where should I get if from

acoustic imp
#

Get the one from poomsmarts repo

shrewd moth
acoustic imp
#

Um well look on GH ?

#

Dev question. Could a jb app install a/have a Apple Watch app?

shrewd moth
acoustic imp
gentle grove
#

its so convenient that it hides important log output behind complicated ui's and forces you to learn an entire new interface to do the same things

acoustic imp
#

Finally USB on Mac VM

kind herald
#

Why

acoustic imp
#

@visual meadow how do I get virtual CarPlay for my phone

acoustic imp
granite frigate
acoustic imp
#

Eta when I get a rx580

gentle grove
#

oh thats a gpu

kind herald
#

the RX 580?

#

yes

#

amd graphic card

acoustic imp
#

@visual meadow

kind herald
#

get trolled

visual meadow
#

l

acoustic imp
#

when was T2 a thing

#

like what Xcode version

visual meadow
#

replug the phone

#

see if it works

visual meadow
acoustic imp
visual meadow
#

t2 was like 2018 i think

acoustic imp
#

didn't work smh

#

oh well

#

@visual meadow do i need like dev mode on or somthing ?

#

it crashed now hm

#

Whats is mean if it’s doing this

#

nvm

native orbit
#

t2 is hardware not software

acoustic imp
#

ik

#

but the ealy betas of carplay dont have the check ig

ashen birch
#

reading zefram code is more powerful than any drug i could take

torn oriole
#

(It’s lethal)

visual meadow
#

hnghhh

gentle grove
cloud yacht
proud geyser
#

how to fix xcode stuck on building

#

it gets stuck after a certain point

placid kraken
#

..what

wooden yarrow
wooden yarrow
placid kraken
#

basically how my compiler works is that i have a struct for each function in each module, and each statement inside the function needs the function to get a valid label for temporary variables and to add/assign instructions

#

however, as i cant make each statement the owner of Function as there are multiple, i have to pass a mutable reference

#

which works fine at the start, however parsing an ast means you have to recursively call the same compilation method again with the children of your current method

#

and that means you need to pass that mutable reference into the recursive call

#

however rust only allows one mutable borrow

wooden yarrow
#

hm

#

Arc Mutex

placid kraken
#

so i cant do that

wooden yarrow
#

troll

placid kraken
#

i mean maybe yeah

#

that could probably work

wooden yarrow
#

wait actually @placid kraken i think that should work regardless

#

sure you aren't passing like &mut var everytime?

placid kraken
#

i mean im probably doing it wrong but cannot borrow self.function as mutable more than once at a time second mutable borrow occurs here

#

in the function itself i do

for statement in body.clone().iter_mut() {
    StatementExpr::new(statement.clone(), &mut res, return_type.clone())
        .compile();
}
wooden yarrow
#

what is res

#

owned or a mut ref

placid kraken
#

owned Function struct

#

in each StatementExpr the ast node needs to be recursively compiled so

let left_parsed = Self::new(
    *left.clone(),
    &mut self.function,
    Some(self.r#type.clone().unwrap_or(Type::Word)),
)
.compile()
.unwrap();
#

oh and self also doesnt live long enough lmao

wooden yarrow
#

is self owned?

#

if this is inside the StatementExpr::new i guess so

placid kraken
#

no this is inside a compile function, i get &mut self inside there

#

new just returns Self and creates a struct

wooden yarrow
#

(instead of it being &mut self.function)

reef trail
#

^

placid kraken
#

yeah but then self may not live long enough because it has no lifetime while the function ref has a 'a lifetime

#

if i give self a bound of a 'a lifetime too then ```
cannot borrow *self.function as mutable more than once at a time
second mutable borrow occurs hererustcClick for full compiler diagnostic
statement.rs(46, 21): first mutable borrow occurs here
statement.rs(13, 6): lifetime 'a defined here
statement.rs(44, 35): argument requires that *self.function is borrowed for 'a

wooden yarrow
#

what does it say without giving self a lifetime bound

reef trail
#

nothing but it won’t last long enough

wooden yarrow
#

i mean if the rust compiler doesn't complain then should work troll

#

also i think 'a should prob be less than self when it's passed?

#

idk i dont know the function signatures

placid kraken
#

it does complain lmao

#

it says that self may not live long enough

#

i’ll probably just Box() it lmao

#

should solve all of my issues

wooden yarrow
#

i am not too convinced

#

but sure

reef trail
#

it’s hard to tell without the whole context

placid kraken
#

yeah lmao i realized

#

will post soon i guess

brazen timber
placid kraken
#

i ended up using an immutable reference to a refcell

#

that way i can borrow_mut() and it works because i can have infinite immutable references so i can pass that refcel ref around

#

and i still have internal mutability

placid kraken
#

ok after rebuilding the compiler from the ground i can now compile this far

data $test = { b "Test %d\n", b 0 }

export function l $main() {
@start
    %tmp_2 =w copy 1
    %tmp_3 =w copy 1
    %tmp_4 =w copy %tmp_2
    %tmp_5 =w copy %tmp_3
    %tmp_6 =w add %tmp_4, %tmp_5
    %tmp_1 =w copy %tmp_6
    %tmp_7 =w call $printf(l $test, ..., w %tmp_1)
    ret 0
}
#
.data
.balign 8
_test:
    .ascii "Test %d\n"
    .byte 0
/* end data */

.text
.balign 4
.globl _main
_main:
    stp    x29, x30, [sp, -16]!
    mov    x29, sp
    mov    x0, #16
    sub    sp, sp, x0
    mov    x0, #0
    add    x1, sp, x0
    mov    w0, #2
    str    w0, [x1]
    adrp    x0, _test@page
    add    x0, x0, _test@pageoff
    bl    _printf
    mov    x0, #16
    add    sp, sp, x0
    mov    x0, #0
    ldp    x29, x30, [sp], 16
    ret
/* end function main */
#

horror

native orbit
#

lowercase @page and @pageoff look so weird to me lol

placid kraken
#

thats just what the qbe ir compiles to lmao

native orbit
#

ir moment

wooden yarrow
placid kraken
#

ok more progress

#
op add(String a) -> String {
    ret a;
}

pub op main() -> Nil {
    let a: Int = add("abcd");
    printf("Test %s\n", $...$, a);
    puts("Hello world!\n");
    ret 0;
}
#

compiles to

function l $add(l %tmp_1) {
@start
    %tmp_2 =l copy %tmp_1
    ret %tmp_2
}
export function w $main() {
@start
    %tmp_5 =l call $add(l $main_4)
    %tmp_3 =l copy %tmp_5
    %tmp_7 =w call $printf(l $main_6, ..., w %tmp_3)
    %tmp_9 =w call $puts(l $main_8)
    %tmp_10 =w copy 0
    ret %tmp_10
}
data $main_4 = { b "abcd", b 0 }
data $main_6 = { b "Test %s\n", b 0 }
data $main_8 = { b "Hello world!\n", b 0 }
#

and ```ts
.text
.balign 4
_add:
stp x29, x30, [sp, -16]!
mov x29, sp
ldp x29, x30, [sp], 16
ret
/* end function add */

.text
.balign 4
.globl _main
_main:
stp x29, x30, [sp, -16]!
mov x29, sp
adrp x0, _main_4@page
add x0, x0, _main_4@pageoff
bl _add
mov x1, #16
sub sp, sp, x1
mov x1, #0
add x1, sp, x1
str w0, [x1]
adrp x0, _main_6@page
add x0, x0, _main_6@pageoff
bl _printf
mov x0, #16
add sp, sp, x0
adrp x0, _main_8@page
add x0, x0, _main_8@pageoff
bl _puts
mov w0, #0
ldp x29, x30, [sp], 16
ret
/* end function main */

.data
.balign 8
_main_4:
.ascii "abcd"
.byte 0
/* end data */

.data
.balign 8
_main_6:
.ascii "Test %s\n"
.byte 0
/* end data */

.data
.balign 8
_main_8:
.ascii "Hello world!\n"
.byte 0
/* end data */

#

so basically, other than structs, aggregate types, loops, pointers, references, conditionals, and static arrays

#

i can write C!!!!

granite frigate
#

genius

placid kraken
radiant idol
#

why not just do func

frail cedar
radiant idol
#

see if I made the language I would've done String add(String a)

#

func/op is unnecessary

frail cedar
#

swift syntax

radiant idol
#

yeah unnecessary

#

and return instead of ret

frail cedar
#

wow

#

ok time to read sirikit docs

radiant idol
#
String add(String a) {
    return a;
}

public Int main() {
    Int a = add("abcd");
    printf("Test %s\n", $...$, a);
    puts("Hello world!\n");
    return 0;
}
#

I'd do this

#

@placid kraken opinions?

placid kraken
placid kraken
radiant idol
#

you could even technically do public Int? main()

placid kraken
radiant idol
#

what even is that

placid kraken
#

i made it so $abc$ gets put in the IL as-is without any parsing

#

so it’ll put the exact characters “…” ignoring all types and scoping

#

it’s there because printf is a variadic function so you need to declare … as the arg after the formatter or it causes undefined behavior

radiant idol
#

whar

placid kraken
#

it’s called an “ExactLiteral” internally

radiant idol
#

looks weird

#

why not just printf("Test %s\n", a);

placid kraken
# radiant idol whar

basically the compiler works in a way where it tokenizes all the identifiers, literals, etc and then parses them in a tree, string literals, when compiled, are first placed into a global data section and then are referenced as a long inside of the function. the exact literal works exactly the same as a string except instead of making a long and declaring types for everything, it just places the exact characters you type into the IL without any modification

radiant idol
#

im confused

placid kraken
#

printf in QBE is variadic which means it can take infinite arguments

#

when calling it you must declare where the infinite arguments begin

#

the 0th argument is the formatted string, then the … to denote the rest are variadic arguments, then all of the arguments

radiant idol
#

but why do you have to explicitly declare that its variadic

placid kraken
#

idk that’s just how the intermediate language works

radiant idol
#

weird

#

are you not able to just do ...

placid kraken
#

i tried to printf(“something %d”, w 3) without the … to denote that it’s variadic and it printed some random number which makes me assume it’s accessing invalid memory

placid kraken
#

actually it wouldn’t even lex it at all because it’s not alphanumeric or digitized

radiant idol
#

hm

#

maybe do something like rust

#
printf!("Test %s\n", a);
#

with the !

placid kraken
#

do you know what the ! actually does lmao

radiant idol
#

no

#

im saying maybe do it like that

#

it looks better than $...$

placid kraken
#

! denotes a macro

radiant idol
#

oh

granite frigate
#

rust macro

radiant idol
#

or just anything after the function name but before the ()

#

idk

placid kraken
#

nope, the parser expects a “(“ to denote a function or nothing to denote an identifier (variable)

radiant idol
#

welp

#

fix your parser then

#

trolled

placid kraken
#

it would add an extra step and make it like

we have identifier
L is !
L is (
do_stuff(variadic: true)
L else panic
L is (
do_stuff(variadic: false)
L else parse_identifier()

radiant idol
#

yeah

#

do that idk

#

! in math means factorial which kinda has a similar concept to infinite arguments

#

maybe im just rambling

placid kraken
#

that’s more a sum/sigma notation

#

but sure i see what you mean

cloud yacht
#

Wait so your language compiles to c now?

slim bramble
#

r*st

cloud yacht
#

Does that mean you can make embedded c in it?

slim bramble
#

Yeah there is a crate iirc

#

I have a friend using it

placid kraken
#

you can call c functions like printf and scanf from stdio

cloud yacht
#

Ah that's neat

#

Does that also mean you can export stuff so c can use it?

placid kraken
placid kraken
cloud yacht
#

Okay

placid kraken
#

but eventually i think i could get c interop

slim bramble
#

Can you even compile rust for iOS hm ?

cloud yacht
#

Yeah someone made a tweak in rust one time

placid kraken
#

so far i have constants, functions, variables, and operations like add, subtract, equal, greater than or equal to

slim bramble
cloud yacht
#

Yeah

placid kraken
cloud yacht
#

Not actually sure if the tweak was fully rust or if it was objc with a rust daemon

placid kraken
#

either way currently the compiler is pretty small

#

given that it does so little that makes sense i guess

#

it’s about 600 lines

#

iirc might be a little more but my mac died

#

it essentially just turns an ast into another ast but this time it implements std::Display

#

and it has to keep track of scopes and data sections and stuff i guess

placid kraken
#

this is what i mean

#

i would have to keep track of variadicy

#

in this

#

even god doesnt know what zefram code does anymore

placid kraken
#

lol the only reason i called it elle is because the qbe ir intermediate language file type is ssa so i can write elle.ssa and make it elsa

tawdry trench
#

watched too much frozen

placid kraken
#

new and better one soon!!!

placid kraken
#

this is annoying

#

im trying to get this working

op isEven(Int num) -> Int {
    ret num % 2 == 0;
}

pub op main() -> Nil {
    let res: Int = isEven(5);
    printf("Is %d even? %d", $...$, res);
}
function w $isEven(w %tmp_1) {
@start
    %tmp_2 =w copy %tmp_1
    %tmp_3 =w copy 2
    %tmp_4 =w rem %tmp_2, %tmp_3
    %tmp_5 =w copy %tmp_4
    %tmp_6 =w copy 0
    %tmp_7 =w ceqw %tmp_5, %tmp_6
    %tmp_8 =w copy %tmp_7
    ret %tmp_8
}
export function w $main() {
@start
    %tmp_10 =w call $isEven(w 5)
    %tmp_9 =w copy %tmp_10
    %tmp_12 =w call $printf(l $main_11, ..., w %tmp_9)
    ret
}
data $main_11 = { b "Is %d even? %d", b 0 }

#

and it looks like it should work

#

ok nvm it works

#

i just did it wrong lmfao

#
op isEven(Int num) {
    ret num % 2 == 0;
}

pub op main() {
    let num: Int = 5;
    let res: Int = isEven(num);
    printf("Is %d even? %d", $...$, num, res);
}
#

compiles into this

function w $isEven(w %tmp_1) {
@start
    %tmp_2 =w copy %tmp_1
    %tmp_3 =w copy 2
    %tmp_4 =w rem %tmp_2, %tmp_3
    %tmp_5 =w copy %tmp_4
    %tmp_6 =w copy 0
    %tmp_7 =w ceqw %tmp_5, %tmp_6
    %tmp_8 =w copy %tmp_7
    ret %tmp_8
}
export function w $main() {
@start
    %tmp_9 =w copy 5
    %tmp_11 =w call $isEven(w %tmp_9)
    %tmp_10 =w copy %tmp_11
    %tmp_13 =w call $printf(l $main_12, ..., w %tmp_9, w %tmp_10)
    ret
}
data $main_12 = { b "Is %d even? %d", b 0 }
pearl sail
#

🙄

cloud yacht
#

🙄

faint timber
reef trail
#

umm what the sigma

queen ruin
#

please we need you

lusty jacinth
#

what da-

tepid olive
#

uhm

#

erm

#

em

#

What in gronks green ohio

tired meteor
#

My operating system is fliping me off why is that?

reef trail
placid kraken
#

no

queen ruin
#

Agreed with rosie
No.

serene hawk
#

is there a way to detect if roothide is installed without using roothide.h?

placid kraken
#

check jbRootPath("/Library/MobileSubstrate/DynamicLibraries/Bloom.dylib") for the roothide patch files

#

this won’t work if the user has no tweaks installed but they’ll always have at least one tweak installed, that being your tweak

serene hawk
#

which roothide patch files lol

placid kraken
#

roothide needs to convert tweaks into arm64e which involves dynamic patches

#

it puts a sidecar file in that folder with the roothide patch inside

serene hawk
#

oh alright didnt know that

#

is there some naming scheme i could check?

placid kraken
#

i don’t remember probably ask someone who’s using roothide to check that folder and tell you what the files are called

serene hawk
#

thank you :))

placid kraken
#

you could alternatively check the source code of the roothide.h header and copy paste the implementation they use for checking if the device is bootstrapped for roothide

serene hawk
#

thanks. such a chaos with roothide... everytime

placid kraken
#

lmao yep

radiant idol
#

Rosie fix enmityygg

placid kraken
#

i’ll do that today

#

today is flora and enmity maintenance day

radiant idol
#

The start times

#

Aaa

placid kraken
#

oh that isn’t being fixed lmao v3 soon

radiant idol
#

Iriejejrttjndbdnddl

placid kraken
#

we’re open sourcing in like a month or less

radiant idol
#

I am going to lose my mind frfr

placid kraken
#

not releasing just open sourcing

radiant idol
#

Aw

placid kraken
#

..which means you can build yourself and run it early lmfao

#

it just means we’re not saying “hey it’s done go and download it there are no bugs!!!!”

#

it also gives time for plugin and theme devs to migrate

tawdry trench
#

w

placid kraken
#

ok so it seems that operator precedence actually works !!!

#
pub op main() {
    let res: Int = 1 + 2 * 3 + 4 * 5 / 6 % 7;
    printf("%d", $...$, res); // 10
}
#
console.log(1 + 2 * 3 + 4 * 5 / 6 % 7) // 10.334
#

if it was evaluated from left to right then it would be 3.833334

#

i still cant figure out how float division works lmfao

placid kraken
#

ok well i figured out something

#

im either compiling it wrong or qbe is compiling it wrong

#
export function w $main() {
@start
    %y =d add d_0, d_-1
    %z =w call $printf(l $test, ..., d %y)
    ret 0
}

data $test = { b "test %f", b 0 }
``` i tried to do this
#

it fails at the linking stage saying it cannot find the _Lfp0 symbol

#

the assembly is this

.text
.balign 4
.globl _main
_main:
    stp    x29, x30, [sp, -16]!
    mov    x29, sp
    mov    x0, #16
    sub    sp, sp, x0
    mov    x0, #0
    add    x0, sp, x0
    adrp    x1, _Lfp0@page
    add    x1, x1, _Lfp0@pageoff
    ldr    d0, [x1]
    str    d0, [x0]
    adrp    x0, _test@page
    add    x0, x0, _test@pageoff
    bl    _printf
    mov    x0, #16
    add    sp, sp, x0
    mov    w0, #0
    ldp    x29, x30, [sp], 16
    ret
/* end function main */

.data
.balign 8
_test:
    .ascii "test %f"
    .byte 0
/* end data */

/* floating point constants */
.section __TEXT,__literal8,8byte_literals
.p2align 3
Lfp0:
    .int 0
    .int -1074790400 /* -1.000000 */
#

the reason it fails is because the _main symbol is trying to access the _Lfp0 symbol however its defined as just Lfp0

#

if i manually change the section to be named _Lfp0 it compiles and i get my result

#

strange

#

the thing is, the developer uploaded the code on a custom git instance so i cant make an issue

placid kraken
#

i emailed their mailing list lol

placid kraken
placid kraken
#

@radiant idol what do you think this writes to stdout

pub op main() {
    let num: Int = 0;
    let a: Int = 5;
    let num: Int = num + 1;
    let num: Int = num + 1;
    let num: Int = num + 1;
    printf("%d", $...$, num);
}
radiant idol
#

um

#

1?

placid kraken
radiant idol
#

yeah

placid kraken
#

in QBE IR you can redeclare temp variables

hasty ruin
placid kraken
#

so if you do this

pub op main() {
    let num: Int = 0;
    let num: Int = num + 1;
    let num: Int = num + 1;
    let num: Int = num + 1;
    printf("%d", $...$, num);
}
``` it compiles !!!
placid kraken
#

it works now

hasty ruin
radiant idol
#
public void main() {
    Int num = 0;
    Int a = 5;
    Int num = num + 1;
    Int num = num + 1;
    Int num = num + 1;
    printf!("%d", num);
}

this looks better

#

.

placid kraken
#

this is the IL code

export function w $main() {
@start
    %tmp_1 =w copy 0
    %tmp_2 =w copy %tmp_1
    %tmp_3 =w copy 1
    %tmp_4 =w add %tmp_2, %tmp_3
    %tmp_1 =w copy %tmp_4
    %tmp_5 =w copy %tmp_1
    %tmp_6 =w copy 1
    %tmp_7 =w add %tmp_5, %tmp_6
    %tmp_1 =w copy %tmp_7
    %tmp_8 =w copy %tmp_1
    %tmp_9 =w copy 1
    %tmp_10 =w add %tmp_8, %tmp_9
    %tmp_1 =w copy %tmp_10
    %tmp_12 =w call $printf(l $main_11, ..., w %tmp_1)
    ret
}
data $main_11 = { b "%d", b 0 }
hasty ruin
slim bramble
#

Easy fix don't use rust

#

fixes all of your issues

placid kraken
#

im actually gonna do that right now

slim bramble
#

@hasty ruin supporting rust ????

#

Wtf icraze trans

radiant idol
#

yes because : Type is just unnecessary

hasty ruin
hasty ruin
slim bramble
radiant idol
#

fr

placid kraken
# slim bramble Easy fix don't use rust

this code is horror i agree

fn new_var(&mut self, ty: &Type, name: &str) -> GeneratorResult<Value> {
    let existing_var = self.get_var(name);

    let tmp = match existing_var {
        Ok((_, val)) => {
            match val.clone() {
                Value::Temporary(name) => {
                    match self.get_tmp_index(name) {
                        Some(val) => Value::Temporary(format!("tmp_{}", val)),
                        None => self.new_temporary()
                    }
                }
                _ => self.new_temporary()
            }
        }
        Err(_) => self.new_temporary()
    };

    let scope = self
        .scopes
        .last_mut()
        .expect("Expected last scope to exist");

    scope.insert(name.to_owned(), (ty.to_owned(), tmp.to_owned()));

    Ok(tmp)
}
radiant idol
#

not rust

slim bramble
#

not the nightwind code

radiant idol
#

that's not rust

placid kraken
#

but what would you rather i write it instead? Swift? trol

hasty ruin
#

it’s a rust clone troll

radiant idol
#

objc

placid kraken
#

its literally missing if statements, loops, optional types, aggregate types, arrays, pointers and references

placid kraken
slim bramble
placid kraken
#

yes

slim bramble
#

Oh god I cannot wait for my phone to crash

placid kraken
#

ok there we go lmao

#

that was actually really easy

#

i already had all the utility functions and types were already mandatory

#
pub op main() {
    Int num = 0;
    Int num = num + 1;
    Int num = num + 1;
    Int num = num + 1;
    Int num = num + 1;
    printf("%d\n", $...$, num);
}
``` @radiant idol
radiant idol
#

I still don't like the $...$ but

#

that can stay I guess

placid kraken
#

i might also replace op with fn because EVERY SINGLE PERSON IVE SHOWED THIS TO HAS ASKED ME WHAT THE op MEANS

radiant idol
#

change it to func at least

placid kraken
#

then it becomes a real rust clone

radiant idol
#

fn is weird

#

or better yet change it to the return type

placid kraken
placid kraken
radiant idol
#

yes but at least it's better than fn

radiant idol
radiant idol
#

whar

slim bramble
radiant idol
placid kraken
slim bramble
#

What in the goof

radiant idol
placid kraken
#

theyre top level and they contain an astnode inside

radiant idol
#

speak in normal langs

hasty ruin
hexed knot
#

What is $..$

placid kraken
radiant idol
hexed knot
#

smartest orange name👍👍

placid kraken
# hexed knot What is $..$

its an exact literal, it places the characters inside, exactly as theyre written with no types or anything, directly inside of the intermediate language's output

#

so if i type $blabla$ itll take that and display it exactly how i wrote it inside of the IL code

#

like this

slim bramble
#
public class Main {
  public static void main(String[] args) {
    int num = 0;
    num+=1;
    num+=1;
    num+=1;
    num+=1;
    System.out.println(num);
  }
}```
placid kraken
#

no type or sigil

hexed knot
#

Oh ok

placid kraken
placid kraken
#

ill have to lex some new things

slim bramble
hexed knot
#

This ain’t java

placid kraken
#

ill figure it out because i do want += which doesnt exist yet

radiant idol
#
public func main() -> Void {
    Int num = 0;
    Int a = 5;
    Int num = num + 1;
    Int num = num + 1;
    Int num = num + 1;
    printf!("%d", num);
}
slim bramble
placid kraken
#

lesbian sex?!
@hasty ruin tokenize, lex, whatever

hasty ruin
hexed knot
#

Bro why are u using quotes

placid kraken
#

i still cant compile floating point numbers because the backend compiles the assembly wrong lmfao

hexed knot
#

Its 2024

placid kraken
#

and i can still type it out by hand

#

its like a manual snipe

hasty ruin
#

mods message logger :/

hexed knot
#

I just use my message logger for stuff like that

placid kraken
#

oh

#

NOO I CANT MAKE A POLL

#
  1. fn
  2. func
  3. op
  4. icraze
hasty ruin
#

@torn oriole at least give devs perms for polls in here

placid kraken
#

icraze remove that

#

and replace it

hasty ruin
placid kraken
#

smh my head

hasty ruin
#

GENIUS ABUSE

sonic totem
#

???

#

I genuinely did nothing

#

I was typing something else

hexed knot
#

Devs can remove reactions bro

hasty ruin
#

Oh yeah

placid kraken
#

oh that wasnt me then

#

lmao

hexed knot
#

Manage messages perms

hexed knot
#

k n word

placid kraken
hasty ruin
hasty ruin
hexed knot
#

do meth

#

short for method

placid kraken
#

LMAO

#

i want a 2 character name because it should be very fast to type out

hasty ruin
#

“ic”

placid kraken
#

pub me

#

pub ic

hexed knot
#

pub joe

placid kraken
#

ok well its called fn now

#

i didnt realise just how maintainable this is wtf

#

i literally can change around things so easily

hasty ruin
#

cmd shift f
“op”
“fn”

hexed knot
#

yeah unironically

radiant idol
#

please

#

fn is so ugly

placid kraken
#

and general meta stuff like that

placid kraken
crisp frost
#

fn is a abbreviation for fortnite tho

radiant idol
#

function

placid kraken
radiant idol
#

I don't even know why this keyword is a thing honestly, having the return type there makes a lot of sense

#

like we know it's a function already

placid kraken
radiant idol
#

make it know then ✅

crisp frost
#

Just use some regex in the parser

placid kraken
#

also types are capitalized lmfao

#
pub Int main() {}
``` looks soooo ugly
#

currently its

pub fn main() -> Int {}
crisp frost
#

Is this rust again

placid kraken
#

no

#

im making my own language just the syntax happens to be similar

placid kraken
#

initialy i made it

expose op main() -> Int {}

but i didnt like those keywords

#

so it slowly developed into looking like rust lmfao

torn oriole
#

I expect it to contain a hardcoded error condition if a string contains “icraze”

placid kraken
#

its not even at compile time its at tokenization time

torn oriole
#

excellent

crisp frost
placid kraken
#

need to catch such horrible crimes like this early

#

otherwise they'll develop into worse things

placid kraken
hasty ruin
#

Oh we’re not in ONO

torn oriole
placid kraken
#

my language doesnt even have if statments yet lmfao

#

nevermind structs and enums and match statements and tuples

#

what other things should i have other than += and -= @radiant idol

radiant idol
#

/= *= %=

placid kraken
#

!= already exists as a conditional

hasty ruin
#

//

placid kraken
placid kraken
radiant idol
#

and ++ and -- i guess

placid kraken
hasty ruin
radiant idol
#

wait i dont get it

#

// for what

hasty ruin
placid kraken
radiant idol
#

good

placid kraken
#

++ for add one

#

-- for subtract one

hasty ruin
placid kraken
#

** for muliply by one

radiant idol
placid kraken
radiant idol
placid kraken
#

num * num is fine for now

#

i should probably also add bsl and bsr binops

radiant idol
#
public func main() -> Void {
    Int someInt = 2 ** 4;
    printf!("%d", someInt); // 16
}
placid kraken
radiant idol
#

yes

placid kraken
#

because that might aswell be swift

#

i do NOT want to write another swift

#

also Void isnt real, it's Nil

#
pub fn get_type(&mut self, r#type: String) -> Option<Type> {
    match r#type.as_str() {
        "Byte" => Some(Type::Byte),
        "Halfword" => Some(Type::Halfword),
        "Word" => Some(Type::Word),
        "String" => Some(Type::Long),
        "Int" => Some(Type::Word),
        "Long" => Some(Type::Long),
        "Single" => Some(Type::Single),
        "Double" => Some(Type::Double),
        "Nil" => None,
        _ => Some(Type::Word),
    }
}
radiant idol
#

why not Void

placid kraken
#

because idk its always been nil

hasty ruin
#

looks goofy

radiant idol
#

variadic

placid kraken
hexed knot
#

operator dumping

#

my favorite ❤️

placid kraken
#

whats operator dumping

#

is that +=

hasty ruin
#

need objc interop

hexed knot
#

nah += is fine

placid kraken
#

idk what operator dumping is lmao

hexed knot
#

operator dumping is when you just use like every single special character to do something

#

like in swift ? is optional(i think)

placid kraken
#

oh

hexed knot
#

! Is something

hasty ruin
#

@placid kraken have you done order of operations

hasty ruin
#

🔥

hexed knot
#

wrong reply.

placid kraken
#

any other tokens i should lex?

hasty ruin
#

icraze

placid kraken
#

this is a true 2024 statement

acoustic imp
#

Icrazy

placid kraken
#

im not gonna lex =+ and =- ill do += and -= only

#

because =+ is stupid

radiant idol
#

Nightwind

hexed knot
placid kraken
sonic totem
placid kraken
#

you mean ++num and num++

hexed knot
#

Yea

hasty ruin
placid kraken
#

num++

hasty ruin
#

Ever heard of prysm?

placid kraken
#

but i can make it work with ++num if you really want it to

hexed knot
#

No

#

I mean

#

Theres a difference between num++ and ++num

placid kraken
#

i think C lets you do that lmao

hasty ruin
#

increment then return or return then increment

hexed knot
#

Yeah

#

So which one does ur language do

placid kraken
#

oh, i guess ill do return then increment?

#

num++ will expand to num = num + 1

#

just like num += 5 will expand to num = num + 5

radiant idol
#

I fixed spinlock panics

hexed knot
placid kraken
#

oh its this

#

anyone who stores the result of a += or ++ into another variable is insane anyway

slim bramble
#

Fuck Havoc

#

It's now ad full.

hasty ruin
slim bramble
hasty ruin
#

aim released first but I had posted about nexus already

#

because some of us don’t rush releases troll

hasty ruin
slim bramble
slim bramble
hasty ruin
#

Those of us in ONO yeah

hasty ruin
slim bramble
hasty ruin
#

Then aim dropped so I took a little break

#

nexus was 95% done by the new year but I got burnt out and took a 3 month break

#

then released 🔥

hasty ruin
hasty ruin
slim bramble
slim bramble
#

MM-dd is cringe ngl

placid kraken
#

this is horror

sonic totem
slim bramble
#

Some guy likes to crack ifykyk

#

Won’t say his name tho

native orbit
#

:: languages sus

sonic totem
#

Nightwind

placid kraken
#

ok wait

#

is exponentiation higher than multiplication in terms of operator precedence

#

yes it is

warped sparrow
#

Chariz better fr

placid kraken
#

oh god horror

#

qbe ir doesnt have a built in exponentiation instruction

#

i cant even just use a for loop to hardcode the number of multiplications

#

because the way it works is that the rhs of the operator can be another AstNode

#

if it was hardcoded to be an integer then that kinda sucks

#

because it means you cant call functions in place

#

that return an integer

slim bramble
placid kraken
#

ok @radiant idol what do you expect this to print

pub fn main() {
    Int num = 0;
    num++;
    num++;

    num += 5;
    printf("%d\n", $...$, num);
}
placid kraken
#

well surprisingly enough it worked first try

slim bramble
placid kraken
#

i get the operation after an identifier

let res = match operation.kind {
    TokenKind::AddOne => Some(AstNode::DeclareStatement {
        name: name.clone(),
        r#type: "Nil".to_owned(),
        value: Box::new(AstNode::ArithmeticOperation {
            left: Box::new(AstNode::LiteralStatement {
                kind: TokenKind::Identifier,
                value: ValueKind::String(name.clone()),
            }),
            right: Box::new(AstNode::LiteralStatement {
                kind: TokenKind::IntegerLiteral,
                value: ValueKind::Number(1),
            }),
            operator: TokenKind::Add,
        }),
    }),
    TokenKind::SubtractOne => Some(AstNode::DeclareStatement {
        name: name.clone(),
        r#type: "Nil".to_owned(),
        value: Box::new(AstNode::ArithmeticOperation {
            left: Box::new(AstNode::LiteralStatement {
                kind: TokenKind::Identifier,
                value: ValueKind::String(name.clone()),
            }),
            right: Box::new(AstNode::LiteralStatement {
                kind: TokenKind::IntegerLiteral,
                value: ValueKind::Number(1),
            }),
            operator: TokenKind::Subtract,
        }),
    }),
    _ => None,
};

if res.is_some() {
    self.expect_token(TokenKind::Semicolon);
    return res.unwrap();
}
``` then i check if its AddOne or SubtractOne
#

if it is then i generate a new declare statement with no type (its inferred later)

#

then i either add or subtract the literal number "1"

#

and i expect a semicolon

#

if it isnt one of those 2 operators then

#

i parse until a semicolon

#
let mut value = vec![];

while self.current_token().kind != TokenKind::Semicolon && !self.is_eof() {
    value.push(self.current_token());
    self.advance();
}

self.expect_token(TokenKind::Semicolon);

let mapping = match operation.kind {
    TokenKind::AddEqual => TokenKind::Add,
    TokenKind::SubtractEqual => TokenKind::Subtract,
    TokenKind::MultiplyEqual => TokenKind::Multiply,
    TokenKind::DivideEqual => TokenKind::Divide,
    TokenKind::ModulusEqual => TokenKind::Modulus,
    other => panic!("Invalid identifier operation {:?}", other),
};

AstNode::DeclareStatement {
    name: name.clone(),
    r#type: "Nil".to_owned(),
    value: Box::new(AstNode::ArithmeticOperation {
        left: Box::new(AstNode::LiteralStatement {
            kind: TokenKind::Identifier,
            value: ValueKind::String(name),
        }),
        right: Box::new(Statement::new(value, 0).parse().0),
        operator: mapping,
    }),
}
``` then i map the operator with Equal to the right normal operator
slim bramble
#

Will your compiler be open source ?

placid kraken
#

then i declare the variable with the right being recursively parsed

placid kraken
slim bramble
#

Where is the GitHub

placid kraken
#

hang on i need to push this first

slim bramble
placid kraken
#

if you try

pub fn main() {
    a++;
    printf("%d\n", $...$, a);
}
``` it fails with `qbe:main.ssa:22: ssa temporary %tmp_11 is used undefined in @start`
#

if you try

pub fn main() {
    Int a = 10;
    a++;
    printf("%d\n", $...$, a);
}
``` you get `11`
#

#

ok there

native orbit
#

do you handle prefix operators? i.e. ++a

placid kraken
#

fuck i forgot to remove this LMAO

placid kraken
#

the primary parser works like this

fn parse_primary(&mut self) -> AstNode {
    match self.current_token().kind {
        TokenKind::IntegerLiteral
        | TokenKind::StringLiteral
        | TokenKind::CharLiteral
        | TokenKind::ExactLiteral => self.parse_literal(),
        TokenKind::Identifier => {
            if self.is_eof() {
                self.parse_literal()
            } else {
                let next = self.tokens[self.position + 1].clone();

                if next.kind == TokenKind::LeftParenthesis {
                    self.parse_function()
                } else if next.kind.is_declarative() {
                    self.parse_declarative_like()
                } else if next.kind.is_arithmetic() {
                    self.parse_arithmetic()
                } else {
                    panic!(
                        "[{:?}] Expected left parenthesis or arithmetic, got {:?}",
                        self.current_token().location.display(),
                        self.current_token().kind
                    );
                }
            }
        }
        _ => panic!(
            "[{:?}] Expected expression, got {:?}",
            self.current_token().location.display(),
            self.current_token().kind
        ),
    }
}
#

it only parses ++ or += if it sees an identifier first

hasty ruin
placid kraken
#

i could make it match for ++ and then expect an identifier right after

placid kraken
#

anyway ++ and += arent really their own operator

#

they just expand like

num++;

into

Nil num = num + 1; // the real type is inferred at compile time

and

num *= 10;

into

Nil num = num * 10;
#

its sort of like a macro

#

you could write Nil num = num + 1; and it would have the same effect as num++

placid kraken
#

@hasty ruin

#

Do not utter thy words

hasty ruin
#

why the fuck is it blue

placid kraken
#

arc boosts but i just like how it looks

tired meteor
#

i swear if someone changes the subject

placid kraken
tired meteor
#

I had an error

hexed knot
cloud yacht
frail cedar
#

@placid kraken is flora rootless only?

#

i'm trying to get it but it just says unavailable

velvet path
#

I believe so?

faint timber
#

A tale as old as time itself

#

It continues to happen

#

$(TWEAK_NAME)_*

proud geyser
#
//
//  TokenStorage.swift
//  PlayGround
//
//  Created by Jaspreet Malak on 4/11/24.
//

import Foundation

class TokenStorage {
    private let userDefaults: UserDefaults

    init(userDefaults: UserDefaults = .standard) {
        self.userDefaults = userDefaults
    }

    func saveToken(token: String) {
        userDefaults.set(token, forKey: "accessToken")
    }

    func getToken() -> String? {
        userDefaults.string(forKey: "accessToken")
    }

    func clearToken() {
        userDefaults.removeObject(forKey: "accessToken")
    }
}
``` how does one remove keys for a device on xcode for testing
#

i wanna clear tokens from xcode if its possible rather than just running clearToken() inside the app

#

can i run a blank install of an app everytime i run it..?

queen ruin
queen ruin
#

True

frail cedar
#

Spectrum is giving me issues

hollow oar
#

Isn’t there [[Kaleidoscope]]?

faint lionBOT
#
Kaleidoscope

Custom colours for iOS 13

Author

Spark

Version

1.0.3

Price

Free

Repo
Bundle ID

com.spark.kaleidoscope

hollow oar
#

Never mind.

lusty jacinth
frail cedar
#

it doesn't show up for me at all

lyric heron
#

isn't the deb on the github

frail cedar
#

i haven't set up theos on my new phone

#

and i want to buy it

#

but i uhh can't

hollow oar
placid kraken
#

i didn’t upload rootful because i have no way to test it

#

you’re welcome to build it for rootful and test it yourself but it might have issues

faint timber
#

legendary