Tumgik
#slightly modified for context but y’know
redtyrannoranger · 22 days
Text
*Ethan, Kira and Trent standing in a classroom and talking about the new student, who’s been noted by literally everyone as being extremely handsome*
Conner: *storms into the class* This stinks, this is total BS! I’m supposed to be the only sex symbol around here. *lifts up his shirt, exposing his abs* Look at this. Eh? Eh? *slaps his abs* G’head, try and knock me over.
Kira: *inhales deeply like she’s about to ptera scream*
Conner: *drops his shirt and jumps back* Whoa, whoa, not you! *gestures at Ethan/Trent* I meant one of them two. *stalks off angrily*
8 notes · View notes
teddy-bear-surprise · 3 years
Note
hi!! how are you? i seen your post about wanting to write headcannons or blurbs and i didn't know if you wanted them to be birthday related but osbddkndjdd staying up until exactly 12 am with peter and once it hits, the reader gives him a bunch of kisses & let's him now how happy she is to be with him!!!
This story is also available on AO3 and Wattpad!
Hi! Thank you so much for the request, I'm doing great today and I hope you are too <3
MASTERLIST
Title: Midnight Birthday
Word Count: ~2.4k
Warnings: None (they joke around about poop and farts, which makes me sound immature, but I promise it’s funny and not like serious)
Context needed: Y/N
I deviated slightly from the prompt on accident, but I hope you enjoy it :)
Your phone rang loudly for the third time, prompting you to finally pick up. Normally, you would ignore everyone’s phone calls, but you realized that Peter was the one calling you. You had set a special ringtone for him, just so this wouldn’t happen, yet he still had to call multiple times just to get your attention.
“Hey, Peter! Sorry I didn’t pick up before… You know how it is, right?”
Peter chuckled on the other end of the line, “Yeah, I know. We should really come up with a better system for you. I don’t even want to imagine what would happen if there was an emergency and they had to call you. I know you can’t see me right now, but just the thought gave me goosebumps.”
You heard him shudder, “I’m sure you’re very goosebumpy, Spider-Kid.”
“Hey!” He asserted jokingly, “You know that I prefer ‘Spider-Man’, you know that. And don’t be mean to me! I’m over here calling to invite you out to dinner and this is what I get? I am beyond hurt. I will never recover.” Peter emphasized each word as sarcastically as he possibly could.
“Oh, get over yourself drama queen. Spider-Boy, Spider-Kid, Spider-Man, it’s all the same thiiinnggggg. Just take the compliment, hun. In thirty years– when you’re all old, wrinkly, and a Spider-Senior –you’ll be missing the days when people called you Spider-Kid. Now, what were you saying about dinner?”
“I said I wanted to invite you out to dinner! Were you not listening?”
You rolled your eyes and wished he could see your face right now. “I got that part, genius. I meant like what kind of dinner… Y’know, Where? When? The details, Pete, the details.”
“Oohhhh, that would make sense.” He laughed quietly, shaking his head at his own stupidity. “I was thinking that we could go to that restaurant you love, you know the one you were talking about the other day… Ummmm I think it was called Sveleka? Right? So we could go there around 7…”
Peter’s voice trailed off as he tried to remember the details of his plan and you cut in. “It’s Veselka, but that would be great, Pete. I’ll see you there at 7, love you.”
You hung up the phone before Peter even got a chance to reply. Your phone skills were rudimentary, to say the least, and it always got you into trouble. Luckily, Peter understood your bizarre hatred of phones and phone calls, allowing you to talk to him without worrying too much.
You knew that his birthday was tomorrow and you had developed a plan of your own. It was supposed to be a surprise, and the last thing you were expecting was for him to ask you out to dinner the night before his own birthday. In a way, it made you appreciate him even more, knowing that he loved you enough to randomly call you and ask you out to dinner. But now, thanks to his unexpected decision, you only had two hours to rearrange everything before meeting up with him for dinner. You stared at the giant teddy bear sitting on your bed and sighed. Even though your plan was technically easier to carry out now, you felt a twinge of annoyance about having to modify your schedule.
Originally, you wanted to sneak into Peter’s apartment, along with May’s help, and surprise him with a giant teddy bear that said “I love you” when you hugged it. Ideally, you would get there right at midnight, as the night turned from August 9th to 10th, and show him that you cared. That you cared about his birthday, his happiness, and his wellbeing.
You shook away the thought and positioned the teddy bear so that it looked like it wanted to give you a hug. In between its warm, fluffy arms, you placed a small box. This box was technically Peter’s real present. It contained a small, circular locket with one half of a glass spider and a key. In the very same box, you included a long handwritten note telling Peter how much you loved him and how proud you were of him. Once you rearranged the box and bear to your liking, you began to get ready.
The closet of your apartment was minuscule, as was the whole place, and the limited space had led you to develop a very limited wardrobe. Your outfits only consisting of basic black pieces, one dark green jacket, and three pairs of shoes. Peter always joked that he loved how your closet all looked the same, claiming that it made it easier to find you if you ever got lost in a crowd. You both knew that was far from true since everyone in Manhattan loves wearing black, but you appreciated that he was so kind about your unconventional fashion decision.
You grabbed a simple, long black skirt and a silky black tank top, changing out of your pajamas. It might have been five o’clock in the afternoon, but pajamas stayed on until you left the house. That was just the rule. While you fixed your hair and makeup, you began to worry that Peter would figure out your plan. It was a slightly irrational thought, especially since he was socially inept and on multiple occasions forgot when his birthday was. Still, the thought plagued your mind until the moment you were ready to leave.
As you walked to Grand Central station, you texted Aunt May, letting her know that the plan had changed. May had been the biggest supporter of you and Peter’s relationship from the start. Honestly, she was the only one you could trust because she was the only one who could keep both your and Peter’s identities a secret. You hopped onto the Six heading downtown, hoping that she would reply before your service completely cut out.
You: Hi, May. Peter invited me out for dinner at the last minute so we might have to rearrange a bit.
May: This is why I told you to make plans with him ahead of time, so we wouldn’t run into any bumps like this.
You: I know, sorry. I wasn’t expecting him to do this.
May: I was kind of expecting it… I made a bet with myself that he would do this and it looks like I won!
You: You bet on us?? Is this like a reoccurring thing???
May: Definitely not. That would be immature. I’d never do that.
You shook your head at your phone, laughing at how obvious it was that May bet on your and Peter’s relationship. To you, May was like a second mother, or just a really cool aunt. She seemed to understand how to be just serious enough, but not stiff. Not to mention that she was ten times nicer and more supportive of you than your actual mom.
You: I’m gonna pretend that the last part of the conversation never happened. But what I wanted to tell you was that I’m going to meet Peter for dinner around 7 at Veselka so I won’t be able to go back to my apartment and then to Peter’s in time. I just left the bear at my apartment and I’m thinking of asking Peter to go home with me after we eat, what do you think?
May: Sounds like a solid plan, kiddo. Good luck, and please don’t let Peter eat too many of those sauerkraut pierogies this time, he was gassy for two days. It wasn’t fun.
You: Thanks for the gross heads-up, May. Byeeee
You got off at Astor Place and walked in silence towards the restaurant. You were looking at the ground, head hanging low, when Peter called out to you from across the street.
“Y/N, hi!”
You looked up at him and smiled at the goofy boy waving at you. “Hi, Peter!”
Jogging across the street, you made eye contact with him. He held out a hand towards you, helping you onto the sidewalk, and embraced you. Peter kissed the top of your head softly and gave you one last squeeze before letting go.
“So, I guess we’re both early then. I gotta say that I’m shocked, Parker. I wasn’t expecting you to get here before me.”
“What can I say, I’m full of surprises.” Peter winked at you.
---
The two of you merrily ate your dinner, with Peter threatening to instigate a food fight more than once. You talked about anything and everything, by the time you two were ready to pay the bill, it was almost 11 and you were stuffed.
Peter rubbed his hand on his stomach, poking at it, “I think it would be physically impossible for me to eat any more. Like I would just spchwoooo,” he mimicked an explosion with his hands, “explode.”
“I’m just glad we didn’t order any of those sauerkraut pierogies, May said they made you all gassy last time. I don’t even want to know what would have happened if you ate those and the stuffed cabbage.”
“What?! May said that? I never get gassy. Ever.” Peter lowered his voice, “I’m literally superhuman, it takes more than some sauerkraut and cabbage to mess with this iron stomach.”
“That’s not even close to being true. You had explosive diarrhea after that burrito two weeks ago, and don’t blame the food, you were the only one out of the three of us who got sick. Did you forget that May and I had to take you to the hospital? Because I don’t think that counts as an ‘iron stomach’.”
The two of you argued about stomachs, diarrhea, and food the rest of the way to your apartment, stopping every few minutes to point out airplanes flying overhead. You insisted on walking home so you could arrive almost exactly at midnight. Plus having Spider-Man by your side was basically a guarantee of safety, even in Manhattan. Peter held your hand the whole time, swinging it like a smitten teenager. After walking nearly fifty blocks, you arrived at your apartment. You noticed that Peter seemed hesitant, only lightly resting his foot on the first step leading up the building.
“C’mon, let’s watch a movie or something. I don’t want you to leave yet.” You pouted and tugged on Peter’s hand, pulling him up into the doorway.
“Well then, I guess I’m not leaving.”
---
The two of you were cuddled on your small couch watching Buzzfeed Unsolved, Peter’s favorite show, but you weren’t paying attention. Every few seconds your eyes would dart up at the clock, waiting for the hour hand to strike 12. Peter was entranced, never letting his attention deviate from the screen, and he didn’t even notice that you weren’t looking at the TV. The minutes went by slowly and you were counting down the seconds until midnight, gripping onto Peter’s arm. He thought that you were just scared by the prospect of unsolved murders, not that you were anxiously waiting for his birthday.
The last second passed and the clock struck 12, you immediately jumped out of Peter’s embrace and turned to him. Peter sat up in shock, confused by your sudden movement. You took the opportunity to straddle him and grab his face.
“Happy birthday, My Love.”
You peppered his face with sweet kisses and his eyes widened. His body softened under your touch as a feeling of love and happiness filled his heart. Peter snaked his hands up your thighs, letting them rest on your hips, and squeezed softly. You gave him one last kiss on the lips and rested your forhead against his.
“I have a surprise for you, Birthday Boy.” You lifted yourself off of his lap and held your hand out to him.
Peter took your hand and followed you obediently, curious to see what his surprise was. You opened the door to your room, revealing the large stuffed bear and its matching box. Peter let go of your hand and excitedly ran towards your bed.
Before he could say anything, you began speaking, “I know it’s not much, and I know you probably thought that I’d have like a trail of rose petals in here or something like that. But I wanted to show you that my love for you isn’t just about our physical relationship, my love for you i-is emotional and wholesome. I love you, Peter Parker. I truly love you and I’m so happy that you’re mine. I mean, every morning I wake up, I remember that I’m dating you, and that makes me the happiest person in the world.” You reached over to the box in Peter’s hands, “So, Peter Parker, will you accept this key?”
You opened the box and Peter’s cheeks glowed red. His eyes sparkled with excitement as he nodded his head.
“Yes! I love you so much too. I- Thank you,” He paused, “Oh no. Wait, I don’t have a key for yo–”
“Pete, this is your birthday present. I wouldn’t expect you to give me a gift on your birthday, silly.”
He rambled energetically, “You’re right… I’m still going to get you a copy though. Oh my gosh. I love this so much, and is this a spider because I’m Spider-Man?! Where’s the other half? This is so cool!”
You held up your matching locket, opening it to reveal the other half. “Yep, it is because you’re Spider-Boy. The best superhero in town. And, don’t throw away the little note at the bottom. Well, don’t open it now, but if you ever need a reminder of how much I love you, just read that note.”
Peter held your hands in his and pulled you down, both of you crashing into the giant teddy bear. The second you fell onto it, it blurted a freakish, distorted “I love you”, scaring both of you. You jumped up and looked at a wide-eyed Peter.
“Y’know, maybe we don’t need the bear. I don’t really want to be on the next episode of Unsolved.”
You laughed at Peter’s joke, pushing the bear onto the ground and kissed him. His soft lips tasted like the blueberry dessert you shared and his skin was as soft as butter.
You pulled away, foreheads resting together once more. Peter whispered, “Thank you for giving me the happiest midnight birthday, darling.”
47 notes · View notes
pyresided · 4 years
Text
[absolutely, perfectly comprehensive, chronological and perfectly explained shindrift timeline for all ur shindrift needs]
          side note ; this is heavily canon divergent and works to take into account @notpetals‘ au where yor has a throne world and didn’t die the first time shin/the renegade ‘killed’ him - also fuck canon
          - the renegade and drifter meet ‘by chance’ and talk, drifter shows the renegade his gets and the ascendant plane
          -  knowing he’s in danger and being keen to keep the renegade out of his business, drifter lays a trap and gives him the name callum sol (dredgen cull) and waits to see if he takes the bait. neither of them really understand the other and shin sees drifter as nothing more than an annoyance to his plans - but he lets the rogue continue, the both of them planning on playing the long game
          - drifter is a difficult man to work with. the renegade is a difficult man to read. the two of them end up clashing in more ways than one - their tempers and stress and everything else boiling over during an altercation that leaves them engaging in a way neither saw coming. drifter has the renegade retreating to lick his wounds in private, it’s a routine that soon repeats itself more often than not when they organise meetings to pass along information
          - the renegade ‘oversees’ drifter setting up gambit as part of their ‘deal’ - almost killing drifter when he finds out about the primevals
          - drifter finds out that callum has been killed and in the process figures out that the renegade is shin malphur, the man with the golden gun and uses a list of dredgen names as leverage to direct him going forward - revelling in his new context for the man that would kill him for even the slightest slip up
          - neither of them will admit it or even consider what it could mean, but their extra curricular activities become more of a habit and less of a fight. their edges blunting ever so slightly, they start sharing a bed after the fact, start organising meetings purely to feel each other again and again
          - drifter sees shin’s face for the first time, shin lets him
         - shin starts to help drifter with testing weapons for gambit prime, helping him perfect his craft while they both get to keep an eye on one another. sometimes they go as far as to test the weapons on shin when there’s no other option thanks to shaxx not allowing gambit weapons in the crucible and drifter wanting to keep a low profile between themselves
          - shortly after drifter is moved into the annex by the vanguard, the nine start to send him visions and anour become an issue. shin is made aware of anour bugging the annex and decides to stay neutral to watch how things play out. somewhere around this time, they’re forced to find comfort in one another when shin finds drifter after a vision sent from the nine and drifter is given no choice but to allow shin to be the one to help him with the aftermath
          - drifter starts gambit prime. shin watches
          - shin meets ghost for the first time after killing drifter while finding out about the two guardians who died permanently during drifter’s first tests of gambit prime, shin is polite and ghost is confused
          - drifter gives shin a jade coin, shin keeps it
         - they carry on with their own ‘lives’, shin following the dredgen names that drifter is feeding him and drifter further earning his spot and reputation in the tower, their relationship at this point is still tense and unsteady but neither of them is dead yet so... y’know
          - having returned to the tower and found out about umbral engrams and the modified banks used in contact events, shin - believing that drifter has gone against their fragile deal - confronted drifter about it. eventually, drifter agrees to show shin one of the pyramids on io. when placed in front of the first pyramid on io, shin has an adverse reaction to the presence of such oppressive darkness, drifter takes him back to the derelict - that’s the turning point
          - having hit a dry spell on the flow of names coming from drifter, shin finds himself face to face with dredgen yor leaving the annex. (duh duh duuuuhhh) not thinking, shin threatens yor - warning him to leave drifter alone and stay out of it. things go sour. the confrontation leaves shin on his knees and drifter with eight rounds from the last word in his stomach. yor leaves with a threat aimed at shin - drifter is healed by ghost when the coast is clear and shin retreats to the wilds
          - overwhelmed and confused by his own reaction to seeing someone who was seemingly, up until recent events, his enemy dying on the ground in front of him - shin takes his frustrations out on whatever he can find. multiple fallen settlements are reported to the vanguard as having been wiped out by huge surges of solar light. drifter searches for him for a week before giving up, deciding that shin didn’t want to be found and that he wasn’t coming back. still haunted by yor’s last words to him, shin continues on his rampage for two weeks before his ghost takes matters into her own hands
          - celia drops shin in the derelict and leaves him to drifter, drifter is angry with shin and punches him - telling him that if he wants to help, he can’t just leave like that. he tends to shin’s injuries (solar burns over half of his torso and left arm) and discovers that he’s light fatigued in the process - the decision is made for shin that he’s to stay on the derelict while he recovers, the both of them deeming it to be the safest place for him
          - drifter makes a deal with yor. he’ll keep shin on a short leash and in return yor will stay away from shin. shin doesn’t take the idea well at first but isn’t given much choice but to trust the rogue when it’s revealed to him that drifter is planning to find a way to kill yor in his throne world if he can just get close enough
         - drifter starts to see more and more of shin malphur without the oppressive covering of light that follows him everywhere. shin starts to understand the dark age drifter more and more, realising that what he knew about the light and the dark wasn’t right, starting to see why he sees the world the way he does and begins to understand the grey area between the two through the one person who would be able to show him
          - cooped up and stuck with each other for far longer periods of time than they’ve been used to, drifter discovers that shin can’t read confidently or write. during his recovery, drifter starts to teach shin to read and write whenever he gets the free time between gambit matches and writing reports for the vanguard
          - shin goes on his first ever date, and it’s with drifter
          - drifter gives shin unspoken truth, a handcannon designed to feel and work similar to the last word but without the infamous appearance - allowing shin to go undetected among the guardians and the tower
          - coming to the realisation that they’re both in deeper than they thought and becoming closer - starting to genuinely rely on each other more and more... the two of them make a promise - a promise to stay 
          - shin starts to wear one of drifter’s jade coins around his neck
          - shin starts playing gambit during his recovery, discovers that he can’t pick up or touch motes due to the high concentration and purity of the light he carries with him and instead focuses on invading - firmly planting himself as a formidable opponent in the new game mode
          - shin’s recovery takes four months in total
          - shin trusts drifter to help him mend his cloak, in the process, drifter learns of the real story behind shin malphur, the man with the golden gun. it’s in that moment that shin realises he wants to rid himself of the renegade once and for all
          - after meeting the emissary of the nine, shin is given the prophecy - drifter eventually relents and they go through the prophecy dungeon together, shin learning more about the nine and and shin sees drifter use his light for the first time
          - shin records ‘vale’
          - fully recovered from their first encounter and not being able to get yor out of his head or understand why he is where he is, shin leaves the derelict without telling drifter and searches yor out. he plans to talk, to ask the questions he’s never had answers for and hopes that the knowledge between them that shin can’t kill yor permanently anymore is enough to stay any bullets. it isn’t. shin draws and his light doesn’t react, he’s shot by thorn in the stomach and yor leaves him there to die - taking the last word with him when he leaves
          - celia sends drifter ‘vale’ prematurely, leaving drifter to assume the worst 
          - half dead and dying fast, shin manages to get back to the derelict before collapsing and drifter is there to pick up the pieces, saving shin’s life and removing the bullet before giving shin his bed to recover in. shin’s light capacity is permanently shrunk between his encounter with thorn and his light fatigue
          - the whispers tell shin his dredgen name while the bullet is being removed
          - drifter learns of celia’s manipulations and underhanded tactics that started the renegade in the first place and kept it going for far longer than it should have. his suspicions of ghosts are only confirmed when celia tells him that she wanted drifter to leave shin and give him back to her. the two of them have a heated conversation before celia eventually backs down - not understanding how drifter can want to keep a light such as shin’s to himself
          - drifter ghosts shin for two weeks, resulting in a heated argument the first time they talk after shin wakes up from his injuries. it’s revealed that shin hadn’t wanted to come to blows with yor, that he had only wanted to shed himself of the renegade persona once and for all in one final attempt to rid himself of yor when it becomes clear that he can’t kill his living nightmare
          - the renegade is retired
          - shin is left to recover on the derelict when it becomes clear that it’s the only safe place for him - essentially moving in living with drifter after that point, finding his first home since palamon
          - drifter give shin another coin, one to flip when he finds himself having to make a decision that he doesn’t have an answer to, a hundred years without thinking about what he actually wants rather than what he’s meant to be killing next becomes obvious when he loses his sole purpose in life up until a week ago
          - trying to find his way in a real life rather than one with a sole purpose like the renegade gave him, shin discovers the crucible. becoming infamous within the rings of regular players, he’s well known but still manages to keep his true identity a secret from the wider reaches of guardians - only a select few know exactly who he is and why he’s so good
          - whilst running what should have been a simple job between the two of them, drifter is shot in a darkness zone, during an ambush aimed at shin. if it wasn’t for shin managing to cauterise the wound with whatever they could find lying about, drifter would have died permanently. shin manages to get drifter back to the derelict without help and drifter is healed as far as his ghost can manage 
          - drifter is bedridden for two weeks, leaving shin to look after him during this time - the both of them realising just how much they need each other now. though this time neither of them try to run away or get out of it. they decide that they’re going to stay like this and that they wouldn’t mind staying together now that they’ve gotten this far
          - two months later, drifter gets the call from elsie bray - he leaves for europa the same day after getting shin to understand that he can’t follow with the high concentration of darkness that they’re going to be dealing with in europa. drifter leaves shin with a list of things to keep him busy and moving while he’s gone
          - shin is left alone and they communicate on and off throughout the time drifter is learning stasis, losing contact when the darkness proves challenging for drifter to control and work his way around
          - shin discovers drifter’s collection of star charts and navigational materials of years past, he decides that he doesn’t want to be involved in this war anymore
          - drifter gets back without having told shin about his learning stasis, their initial meeting doesn’t go to plan at all with shin reacting badly to the darkness surrounding drifter. it takes a week before they can be in the same room again comfortably and another week before things are back to almost normal again between them
          - shin poses that they leave the system once it becomes clear that a stasis filled earth isn’t somewhere he can exist in anymore. drifter obliges
5 notes · View notes
sothischickshe · 4 years
Note
Hello! I’m not sure if I’m going to make sense here but - last year, I feel like everything I wanted happened like, I met about 8 of my faves, had these experiences with some amazing friends and went on 2 trips which I’ve wanted to go for a while. It was such a great yr but there were also crappy times and things that happened/ people involved and things I did which were like not what I wanted or planned + like, I don’t want those things to ruin the good ones, y’know? Idk if I’m making sense
Hey anon, I hope you're doing OK. I must say I'm a lil intrigued that you've come to me to ask this, as it feels a lil outside my wheelhouse and I'm woefully unqualified to provide advice on any topic. Nonetheless I hope you find this of some use!
To an extent, I think you have to take the peaks with the troughs. Shit happens! Life is rarely, if ever, perfect. It sounds like a lot of great things happened with you last year, woo!
In terms of the bad things, and them (not) tainting the good ones - I think, as ever, context is important. Now, you certainly don't need to share this info with me, but it might be helpful to think about why the things you didn't like happened?
As a random example, let's say it was that your passport was stolen.
Was this some random crazy happenstance, was the hotel safe broken into and a bunch of passports stolen? If so, I'm not sure there is a huge amount to learn from this, shit happens sometimes.
Was it cos your 'friend' grabbed it and sold it?? If so, that's a definite lesson about a person you probably don't want in your life unless there were some realllllly extreme circumstances going on!!
Was it cos you left your valuables unattended for a while?? If so, there's a lesson here you can definitely learn about being more cautious with your stuff in the future!
This is obviously a slightly silly example, but I think if the stuff that was crappy you can attribute to a or some cause/s you are able to change (whether that's by not involving yourself with certain people, or modifying your own behaviour to put your happiness and/or safety first) then viewing those negative experiences as positive learning experiences may help?
Also, I think it's important not to beat yourself up. Nobody is perfect. Everybody makes mistakes. Are you preventing yourself from looking back at these more negative experiences? If so, that may be a mistake. You don't need to dwell on them, but it may be helpful to engage with them and accept them as all part of the whole.
Again, it's a little difficult to comment without knowing the specifics, but ultimately, I can think of very few experiences I've had which were ALL rough, or ALL smooth. I find over time a lot of the rough fades away. I find that looking at the roughest head on can be a huge challenge, but time and strategies can help. I find that a bad experience is a worse experience if you end up repeating it. I find that beating yourself up doesn't help.
I also think that it's interesting you are speaking about last year, and not this global plague mess of one. I imagine you may be reflecting on things from the past more during this dystopian hellscape? I think that's totally natural if so, but you may not want to get too in your head about it, things hit different when you don't have your normal outlets and routines. You might find it helpful to write (or draw or sing??) the whole thing out for yourself? You don't have to share it or keep it, but it might help you get perspective on the things that have happened?
10 notes · View notes
ofknowhere-blog · 6 years
Text
more pointless headcanons? of course.
I’ve been doing a lot of thinking on several disparate elements of Tivan’s life, some of which have immediate bearing on this blog and some of which don’t. There’s no really organic way to include them all in a single post, so this is going to be very messy and will likely result in more future posts on certain subjects--we’ll see which way the muse takes me!
As ever, feel free to reblog, add, agree, disagree, start a conversation around what I have to say! I’m all for building a community through conversation. <3
So then. On to the pointless headcanons, yeah?
Space-Brain Vagabond: More on Tivan
--Pardon the Alice Cooper lyric shout-out, he’s my happy place. <3
I don’t have much to add on this subject as of yet that I haven’t already stated on this blog. Rather, I wanted to draw out something I mentioned but failed to elaborate on in my about section. I mention in passing that I’ve given Tivan the power of telemetry; this was in one part to excuse the fact that he is woefully under-powered as an Elder and one part to provide him with a more interesting context for his peculiarities. Telemetry, of course, is in this sense the psychic ability to read recordings in objects by touching them--often having to do with strong emotions or special events the object witnessed by proxy. It is not always limited to reading by object and can extend to people, but nearly always includes the elements of both eye-contact and hand- or physical-contact with the person or object being read.
In a post on my En Dwi blog, I bring up the fact that the shared painting of the nails originates from Tivan’s culture, because hands play a large role in defining status there. Even on reflection, that remains true for me here--but with a slight twist. In his first cinematic scene, Tivan takes Gamora’s hand and kisses it, a clear sign of respect for her: again, not unusual for a culture with an emphasis on hands. This was likely a common greeting among higher-caste members of Cygnus society. For me, what’s notable in the greeting is the rather peculiar way he takes her hand; rather than taking it in the palm, he scoops it up by the back.
Tumblr media Tumblr media
Call it subtle. Call it strange. It’s definitely both! But I also call it significant.
This is a motion that doesn’t strike me as being mass ritualized; it’s practiced enough to appear so, I will give you that, but the steady eye-contact and the purposefulness of the motion communicate to me that it’s something more personal, more meaningful, to Tivan. I believe the peculiar mechanisms of this greeting are actually a modified form of social practice from Cygnus, here changed directly to limit the scope of Tivan’s telemetry.
I believe his hands are the most sensitive part of his whole body, in terms both telemetic and physical. His palms, in particular, are acute instruments, good for use both in finding flaws during curation and in forming telemetric contact. While he can still get vibrations by using the back of his hand, his sense is less acute when the object in question does not come in direct contact with his palm--hence the peculiar greeting. It is a different, still respectful way to greet a guest - one that does not include the danger of accidental discovery of something unpleasant. It is a mark of deep respect for Tivan to greet anyone while intentionally ignoring his palm; it is the same as a telepath reigning in a naturally roaming phenomenon, a means of offering privacy to a guest.
And yes, Tivan very DEEPLY respects Gamora.
Taneleer: Family Life & Cygnus
As with my thinking on Homeworld culture on the other blog, I fully expect my thinking on Cygnus to evolve into its own beast and pick up it’s own peculiarities. This is hardly going to be an extensive review of it. I just want to put the basics out there.
Unlike the unification of Homeworld into a full-planetary regimented hierarchy, Cygnus (much like earth) is fractured across the planet into different countries. Unlike Earth, however, each country is its own continent, and thus has its own specific hierarchies and interests. The Taneleer family hails from one of the largest--and thereby most lucrative and important--continents.
Tivan was the first- or secondborn son of his family, meaning he was bred into rulership and duty from a young age. These contributed to his rather serious, restrained demeanor, almost as much as his telemetry contributed to his muted emotions. Tivan was always a dutiful son. ...or, I should say, nearly always. He was on the cusp of marrying to form a stronger political alliance for the Taneleer family when he met Matani, an off-worlder of no significant planet or family, and fell in love.
Tivan and Matani eloped together and lived for a time on the shore of another planet. The Taneleer family never disowned Tivan--such would have been a disgrace upon them--but their relationship was beyond terse and never mended before Cygnus fell.
The Free Years
For a very short period of time--short relative to the rest of his life, both before and after--Tivan managed to experience a freedom like he had never known before. On the shores of Silmar, next to the sea, Tivan lived with his wife Matani. They had Carina. They lived as a family, happy and wholesome, for a period of time. This time is sometimes referred to as “the Free Years.”
Free from the constraints of his family, from the social expectations of his class, from the confines of the world he had known before, Tivan flourished. He found and kept true love. He had his family. He nurtured his artistic ability--as a painter, a sculptor, a true artist, maker of beauty--and allowed himself to feel. He was at his happiest during the Free Years, able to revel in his emotions without guilt or resentment; he revealed a romantic heart and Romantic sensibilities, and lived softly and lovingly with his family. It was during this period of time on Silmar that Cygnus met its end; that Tivan and Matani met En Dwi; that they rose to the station of Elders; and, at the end, that they lost Carina and eventually each other.
Grief is a powerful thing.
The man who existed during the Free Years is, in many ways, naught now but a dead relic. He can still be felt in the art he wrought through various forms of telemetry and other psychic ability, but the reality is that that happy man withered and died when his family did. It is more likely than not that he will never be resurrected, or will come back as only a ghost of his former self, only in private, only for the right person.
Slave Culture & Knowhere
The majority of attendants in the Museum are slaves. Unsurprising, I know. Slaves are guaranteed lifelong labor at lower costs, and are thus viewed by Tivan as being more efficient for the job than hiring on additional hands. While sometimes apprentices are sent to study as attendants at the Museum, they are few and far between, and never last long. The work is far too taxing for that.
Attendants are taken either from the existing Collection--being eager to leave their cages and willing to accept any role offering them even a modicum of freedom--or are bought wholesale from slaving auctions on Knowhere. Although they are allowed to choose their own manner of dress, they are disbarred from selecting overly-flowy materials, and all of their clothing (regardless of style) is white. These are functional more than aesthetic concerns; former-fitting clothing offers less opportunity for a third party to commit mischief, and white stands out better against the dark setting of the Museum. All attendants--indeed, all or most collectibles--have an obedience disc implanted in them upon arrival (see below). 
The attendants are afforded the freedom to walk around the Museum, to sleep in the attendant’s quarters, and to socialize with one another--so long as the day’s work is done. Sexual relations are forbidden and will result in immediate demotion, sometimes meaning death, other times relegation back to collectible status. Attendants work on a strict schedule maintained by an artificial light source; the attendant’s quarters are kept in a strict twilight lighting, with loud chimes indicating when it is time to rise and return to their shift.
The handful of other considerations already in place have to do with politeness culture. Tivan is referred to as master by all attendants, even the voluntary among them. It is polite to bow or curtsy slightly to him, although too deep or prostrating a bow will insult him (it reminds him too much of his time on Cygnus), and no bow at all with be marked with irritation and warned. He is assisted personally usually only by the Head Attendant, whom he selects personally. He always selects only that individual he feels is most efficient in their duties. Other attendants may elect to serve him when their other duties are completed, but seldom do, as they tend more to fear and revile him. Only the Head Attendant may leave the Museum on errands for Tivan.
Sharing Is Caring?
As well as the sharing of cultural markings as a means of claiming one another as closer parts of the same tribe, many of the Elders share among themselves a variety of things. En Dwi shared his telepathic mastery as a means of creating the Elder Web, the psychic bond they all share and may communicate through; in a similar vein, Tivan often collects things for his siblings. Not trinkets so much as information, lost pets, wanted materials, etc.
He also shares, perfects, and re-shares technology between them.
One of my favorite moments in Thor: Ragnarok is actually the deleted/extended version of the Grandmaster’s first meeting with Thor. Over the course of the scene, one moment in particular sparked interest for me:
Uhm. Yeah, I see you’ve been familiarizing yourself with our - our obedience disc. It’s a little invention of mine, by the way. Y’know, some people find it kind of e-erotic. Walk--walk with me, I’m gonna tell you somethin’. Uh, obedience disc! I’ve never been crazy about that name; it was supposed to be a placeholder until I could think of something better, but then everybody started to call them ‘”obedience disc-discs.”
The question here for me over the past few nights had become “who is ‘everybody’?” Does he mean the scrappers? The servants with jobs? Maybe. It’s not unlikely. But, as is a habit of mine, I chose a different answer.
He means the other Elders.
NB: I make this assertion based on my own opinions of En Dwi. He seldom gives proper credence to shorter-lived creatures, leaving to me to believe that “everybody” must be in reference to people he would consider to be real and to matter enough to not speak fully over...ie, the Elders.
Obedience disc technology has long been in the works for En Dwi, in large part due to his early reluctance to engage in unnecessary violence, but the necessity for them grew as his own opinions twisted over time. The trouble is, the necessity grew beyond him as well. Many of the other Elders, Tivan among them, found they needed an additional means of control as their individual interests slowly narrowed their focus. So obedience discs were passed around among them--and the more technologically adept among the Elders, such as Tivan (with his keen artist’s hands and attention to detail), helped to perfect the technology. Obedience discs are used on Sakaar for servants with jobs, and on Knowhere for Museum attendants. Updating and improving the technology is a frequent pastime for Elders with access to the technology, sometimes only tweaking it to serve their own needs and sometimes changing it to be more accessible to all Elders, at which point it is passed around among them again.
4 notes · View notes
haljathefangirlcat · 3 years
Text
still thinking about that “we Have To Talk about how quips are ruining fandom by destroying meta and turning all fic into shitposts” post @ms-demeanor wrote a great rebuttal to, and about the other posts she wrote about it and about the You’re Doing Fandom Wrong attitude in it, and about the notes on those posts. not gonna reblog or reply to any of those because my thoughts are admittedly kind of random and jumping from place to place and probably OT to the point of the discussion, but you know. still thinking.
so, uh. not trying to start wank or anything but enjoy the ranting that got way out of hand under the cut.
so, like... that one “we can’t just block everyone who quips and shitposts because some of these people also write actual meta but then they unfortunately go back to Not Engaging With Canon by writing quippy shitpost-y stuff” line, or however it was actually phrased? besides the blatant entitlement with the “you have to fandom ONLY in ways I like, I can’t just engage with the part of the content you create that I’m interested in and scroll past the rest” thing (which kinda reminds me of the whole “you can’t CNTW on some of your fics, I should be able to read ALL of your fics” thing, in a way) and the ”I refuse to curate my fandom experience and I’ll make it some stranger’s problem” thing (which... reminds me of a few other things, but tbf it has probably been around since the very first days of fandom), what if someone doesn’t even see meta and quips/shitposts as fundamentally different and mutually exclusive approaches to fandom? what if they see them as just two ways to be interested in a specific fandom and interact with it, and maybe even closely linked together, so going from one to another is actually very, very easy for them? hell, what if they (gasp!) even mix quips and meta together sometimes?
I have a few posts about what I think Baran bo Odar and Jantje Friese might have been doing with mythological references and themes in Dark, and about what I got from the series finale. some are meme-like, phrased in a joking tone, probably even shitpost-y? another one is literally just a gifset plus me having intense Feels in the tags, and the last one is an edit of the kind I’ve seen people complain about as “those cringey unoriginal tumblr aesthetics that all look the same” in at least a couple of occasions. does that automatically mean I only wanted to “win” at fandom (with my hard-earned prize being... a handful of notes in a fandom that’s not even that big compared to others) and that I haven’t actually spent probably way too much time thinking about the significance of Martha’s Ariadne play as a commentary on character interactions/plot/narrative themes (and honestly still do from time to time), or that I don’t occasionally read the captions under other people’s gifsets and suddenly feel very much enlightened about why the Ariadne play mentions the myth of the Flood of all things? that I didn’t start reading posts and comments and reviews and theories about the series finale as soon as I finished watching it? that, just because I didn’t write 10K+ words of Perfectly Serious Seriousness about all that stuff, I simply refused to Engage With The Text? 
... and if I said that I feel a little irrationally self-conscious at the idea of writing down all of my (often rambling, sometimes jumbled) thoughts about a series that to me actually does feel very deep and complex, so adding memes and humor to that or finding different means to put my ideas out there makes me feel more comfortable expressing myself while also taking off the (admittedly made-up) pressure of having to write a whole coherent essay where I have to find a clear and explicit way to explain where every single thought comes from and how it leads to the next like I’m gonna get graded on it? or that a lot of those thoughts stem from memories of spending five years of high school translating and analysing ancient Greek poetry and reading and watching and discussing every available interpretation and reinterpretation of it from Nietzsche to Vernant to Dürrenmatt to Christa Wolf to Pasolini to a lot of others and from certain things in Dark violently hurtling me back to those times without even asking for permission, so a part of my self-consciousness is actually “I probably don’t actually know/remember enough about this to base a whole in-depth analysis on it even though I do think there’s something there” and another part is “shit I’m too lazy to dig through all of my old textbooks and homework and additional readings to hunt for the thing I feel the desperate need to reference or figure out who might have said it, so no extended explanation here either”? I guess in the end it would all boil down to “there’s an amount of effort and physical and mental energy I’m willing to put into fandom but I also have limits to stop something that makes me feel happy from becoming a chore”, which. considering the whole “you have to put all your resources into constantly pouring out 100% serious meta and nothing else because that’s what I like, no deviations allowed” thing? yeah, I can see saying stuff like that would still make me a blight upon fandom. and/or Not Engaging.
which, I realize, it’s a thing I keep coming back to. but that’s because I really, really, really hate it? seriously, what even counts as Engaging With The Text correctly? not shitposts, and not quips either, apparently. Regardless of the fact that humor and crack have existed in fandom since forever and that it’s actually not uncommon AT ALL for them to be born out of looking at canon from different angles, pointing out whatever the fan in question finds surreal/strange/implausible/convoluted/awkward/just kinda funny about it. 
also, not canon divergence/what if fics motivated not by a desire to “fix” something that made us feel bad when it happened in canon but by a desire to actually fix what we felt was objectively a poor writing choice from the author, because we shouldn’t Engage by analysing the text to criticize it or to think over how and why certain aspects of it don’t work for us or how we think the structure of the text itself could be modified or even improved, we should Engage by... writing meta and/or writing canon-compliant fics with perhaps a little allowance for slightly-to-the-left-of-canon-compliant missing moments fics, I guess? 
from what I’ve gathered from reading other fandom discussion some time ago, AUs are also out, especially Modern/No Powers AUs, because those are always just an excuse to slap your fave’s name on your OC/disguise your original fiction as fanfic to get comments/ignore all that’s interesting about canon to write yet another dumb syrupy high school or coffee shop AU, even if I’m honestly not sure what kind of AUs people are even reading to never get to the “there’s no supernatural threat so let’s focus entirely on the fucked-up family dynamics and blatant mental issues in a world where you can’t just ignore them by marrying off your daughter or sending your son to be someone’s squire” AUs or the “this is pretty much what happens in canon but adding new dimensions and different outlooks on the themes by moving everything to a new context” AUs. seriously, I could rec you a pretty great “this guy would be a horrible father and treat his children horribly in any world, it’s not just the feudal society around him, it’s him as a person” AU and that’s literally just the first thing that came to my mind. but, hey, maybe Engaging is only engaging with the canon plot and setting and nothing else, what do I know.
... fuck, thinking about it, I’m not even sure if by “not shitpost and not quips” I should even mean humor/crack? because it’s not like the OP was clear about it in any way? maybe it’s just all that’s weird and tropey and not-canon-compliant? I can see the “everybody gathers in the main character’s stuff to smoke weed and weird shit happens” fic I got a chuckle out of some time ago being one of the dreaded tumblr-born shitpost fics that are supposedly ruining fandom by ensuring that fans stop thinking (?), but what about the “everything is the same but this one character is a catboy, not for any particular reason but just because” fic I’m currently following and loving? people have been joking and shitposting about catboys a lot on tumblr lately (I distinctly remember that the last catboy joke to pop up on my dash was the “I’m your catboy gf and I’m stuck in a wall” one...) and finding an always-a-catboy!AU initially got an amused smile out of me, so is the mere premise enough to make the fic just a joke/just taking a trope and running off with it/just part of a shallow trend? even when the author literally goes “oh shit just realized this is all a metaphor for neuodivergence and masking” in the story notes? unless writing a character who’s never explicitly stated to be neurodivergent in canon as a being literally or metaphorically neurodivergent in your fic is always shallow projecting or posturing issuefic... instead of, y’know, looking closely at the text and Engaging with it by interpreting it that way....
I feel all this ranting/venting might end up plunging into Why We Slash discussion territory now, so I better stop here.
anyway, in short, good to know I’ve been in fandom for years yet I’ve always been just a Fake Fan who Can’t Think and is constantly Doing It Wrong (by Not Being Transformative Enough, possibly). gonna do my best to stay exactly like that in the future <3
0 notes
itbeatsbookmarks · 5 years
Link
(Via: Hacker News)
Tumblr media
Metaprogramming, or the ability to inspect, modify and generate code at compile-time (as opposed to reflection, which is runtime introspection of code), has slowly been gaining momentum. Programmers are finally admitting that, after accidentally inventing turing complete template systems, maybe we should just have proper first-class support for generating code. Rust has macros, Zig has built-in compile time expressions, Nim lets you rewrite the AST however you please, and dependent types have been cropping up all over the place. However, with great power comes great responsibility undecidable type systems, whose undefined behavior may involve summoning eldritch abominations from the Black Abyss of Rěgne Ūt.
One particular place where metaprogramming is particularly useful is low-level, high-performance code, which is what Terra was created for. The idea behind Terra is that, instead of crafting ancient runes inscribed with infinitely nested variadic templates, just replace the whole thing with an actual turing-complete language, like say, Lua (technically including LuaJIT extensions for FFI). This all sounds nice, and no longer requires a circle of salt to ward off demonic syntax, which Terra is quick to point out. They espouse the magical wonders of replacing your metaprogramming system with an actual scripting language:
In Terra, we just gave in to the trend of making the meta-language of C/C++ more powerful and replaced it with a real programming language, Lua.
The combination of a low-level language meta-programmed by a high-level scripting language allows many behaviors that are not possible in other systems. Unlike C/C++, Terra code can be JIT-compiled and run interleaved with Lua evaluation, making it easy to write software libraries that depend on runtime code generation.
Features of other languages such as conditional compilation and templating simply fall out of the combination of using Lua to meta-program Terra
Terra even claims you can implement Java-like OOP inheritance models as libraries and drop them into your program. It may also cure cancer (the instructions were unclear).
As shown in the templating example, Terra allows you to define methods on struct types but does not provide any built-in mechanism for inheritance or polymorphism. Instead, normal class systems can be written as libraries. More information is available in our PLDI Paper.
The file lib/javalike.t has one possible implementation of a Java-like class system, while the file lib/golike.t is more similar to Google’s Go language.
I am here to warn you, traveler, that Terra sits on a throne of lies. I was foolish. I was taken in by their audacious claims and fake jewels. It is only when I finally sat down to dine with them that I realized I was surrounded by nothing but cheap plastic and slightly burnt toast.
The Bracket Syntax Problem
Terra exists as a syntax extension to Lua. This means it adds additional keywords on top of Lua’s existing grammar. Most languages, when extending a syntax, would go to great lengths to ensure the new grammar does not create any ambiguities or otherwise interfere with the original syntax, treating it like a delicate flower that mustn’t be disturbed, lest it lose a single petal.
Terra takes the flower, gently places it on the ground, and then stomps on it, repeatedly, until the flower is nothing but a pile of rubbish, as dead as the dirt it grew from. Then it sets the remains of the flower on fire, collects the ashes that once knew beauty, drives to a nearby cliffside, and throws them into the uncaring ocean. It probably took a piss too, but I can’t prove that.
To understand why, one must understand what the escape operator is. It allows you to splice an abstract AST generated from a Lua expression directly into Terra code. Here is an example from Terra’s website:
function get5() return 5 end terra foobar() return [ get5() + 1 ] end foobar:printpretty() > output: > foobar0 = terra() : {int32} > return 6 > end
But, wait, that means it’s… the same as the array indexing operator? You don’t mean you just put it inside like–
local rest = {symbol(int),symbol(int)} terra doit(first : int, [rest]) return first + [rest[1]] + [rest[2]] end
What.
WHAT?!
You were supposed to banish the syntax demons, not join them! This abomination is an insult to Nine Kingdoms of Asgard! It is the very foundation that Satan himself would use to unleash Evil upon the world. Behold, mortals, for I come as the harbinger of despair:
function idx(x) return `x end function gen(a, b) return `array(a, b) end terra test() -- Intended to evaluate to array(1, 2) 0 return [gen(1, 2)][idx(0)] end
For those of you joining us (probably because you heard a blood-curdling scream from down the hall), this syntax is exactly as ambiguous as you might think. Is it two splice statements put next to each other, or is a splice statement with an array index? You no longer know if a splice operator is supposed to index the array or act as a splice operator, as mentioned in this issue. Terra “resolves this” by just assuming that any two bracketed expressions put next to each other are always an array indexing operation, which is a lot like fixing your server overheating issue by running the fire suppression system all day. However, because this is Lua, whose syntax is very much like a delicate flower that cannot be disturbed, a much worse ambiguity comes up when we try to fix this.
function idx(x) return `x end function gen(a, b) return `array(a, b) end terra test() -- This is required to make it evaluate to array(1,2)[0] -- return [gen(1, 2)][ [idx(0)] ] -- This doesn't work: return [gen(1, 2)][[idx(0)]] -- This is equivalent to: -- return [gen(1, 2)] "idx(0)" end
We want to use a spliced Lua expression as the array index, but if we don’t use any spaces, it turns into a string because [[string]] is the Lua syntax for an unescaped string! Now, those of you who still possess functioning brains may believe that this would always result in a syntax error, as we have now placed a string next to a variable. Not so! Lua, in it’s infinite wisdom, converts anything of the form symbol"string" or symbol[[string]] into a function call with the string as the only parameter. That means that, in certain circumstances, we literally attempt to call our variable as a function with our expression as a string:
local lookups = {x = 0, y = 1, z = 2, w = 3 }; vec.metamethods.__entrymissing = macro(function(entryname, expr) if lookups[entryname] then -- This doesn't work return `expr.v[[lookups[entryname]]] -- This is equivalent to -- return `expr.v "lookups[entryname]" -- But it doesn't result in a syntax error, becase it's equivalent to: -- return `extr.v("lookups[entryname]") else error "That is not a valid field." end end)
As a result, you get a type error, not a syntax error, and a very bizarre one too, because it’s going to complain that v isn’t a function. This is like trying to bake pancakes for breakfast and accidentally going scuba diving instead. It’s not a sequence of events that should ever be related in any universe that obeys causality.
It should be noted that, after a friend of mine heard my screams of agony, an issue was raised to change the syntax to a summoning ritual that involves less self-mutilation. Unfortunately, this is a breaking change, and will probably require an exorcism.
The Documentation Is Wrong
Terra’s documentation is so wrong that it somehow manages to be wrong in both directions. That is, some of the documentation is out-of-date, while some of it refers to concepts that never made it into master. I can only assume that a time-traveling gremlin was hired to write the documentation, who promptly got lost amidst the diverging timelines. It is a quantum document, both right and wrong at the same time, yet somehow always useless, a puzzle beyond the grasp of modern physics.
The first thing talked about in the API Reference is a List object. It does not actually exist. A primitive incarnation of it does exist, but it only implements map() and insertall(). Almost the entire section is completely wrong for the 1.0.0-beta1 release. The actual List object being described sits alone and forgotten in the develop branch, dust already beginning to collect on it’s API calls, despite those API calls being the ones in the documentation… somehow.
:printpretty() is a function that prints out a pretty string representation of a given piece of Terra code, by parsing the AST representation. On it’s face, it does do exactly what is advertised: it prints a string. However, one might assume that it returns the string, or otherwise allows you to do something with it. This doesn’t happen. It literally calls the print() function, throwing the string out the window and straight into the stdout buffer without a care in the world. If you want the actual string, you must call either layoutstring() (for types) or prettystring() (for quotes). Neither function is documented, anywhere.
Macros can only be called from inside Terra code. Unless you give the constructor two parameters, where the second parameter is a function called from inside a Lua context. This behavior is not mentioned in any documentation, anywhere, which makes it even more confusing when someone defines a macro as macro(myfunction, myfunction) and then calls it from a Lua context, which, according to the documentation, should be impossible.
Struct fields are not specified by their name, but rather just held in a numbered list of {name, type} pairs. This is documented, but a consequence of this system is not: Struct field names do not have to be unique. They can all be the same thing. Terra doesn’t actually care. You can’t actually be sure that any given field name lookup will result in, y’know, one field. Nothing mentions this.
The documentation for saveobj is a special kind of infuriating, because everything is technically correct, yet it does not give you any examples and instead simply lists a function with 2 arguments and 4 interwoven optional arguments. In reality it’s absolutely trivial to use because you can ignore almost all the parameters. Just write terralib.saveobj("blah", {main = main}) and you’re done. But there isn’t a single example of this anywhere on the entire website. Only a paragraph and two sentences explaining in the briefest way possible how to use the function, followed by a highly technical example of how to initialize a custom target parameter, which doesn’t actually compile because it has errant semicolons. This is literally the most important function in the entire language, because it’s what actually compiles an executable!
The defer keyword is critical to being able to do proper error cleanup, because it functions similar to Go’s defer by performing a function call at the end of a lexical scope. It is not documented, anywhere, or even mentioned at all on the website. How Terra manages to implement new functionality it forgets to document while, at the same time, documenting functionality that doesn’t exist yet is a 4-dimensional puzzle fit for an extra-dimensional hyperintelligent race of aliens particularly fond of BDSM.
You’d think that compiling Terra on Linux would be a lot simpler, but you’d be wrong. Not only are the makefiles unreliable, but cmake itself doesn’t seem to work with LLVM 7 unless you pass in a very specific set of flags, none of which are documented, because compiling via cmake isn’t documented at all, and this is the only way to compile with LLVM 7 or above on the latest Ubuntu release!
Perhaps there are more tragedies hidden inside this baleful document, but I cannot know, as I have yet to unearth the true depths of the madness lurking within. I am, at most, on the third or fourth circle of hell.
Terra Doesn’t Actually Work On Windows
Saying that Terra supports Windows is a statement fraught with danger. It is a statement so full of holes that an entire screen door could try to sell you car insurance and it’d still be a safer bet than running Terra on Windows. Attempting to use Terra on Windows will work if you have Visual Studio 2015 installed. It might work if you have Visual Studio 2013 installed. No other scenarios are supported, especially not ones that involve being productive. Actually compiling Terra on Windows is a hellish endeavor comparable to climbing Mount Everest in a bathing suit, which requires either having Visual Studio 2015 installed to the default location, or manually modifying a Makefile with the exact absolute paths of all the relevant dependencies. At least up until last week, when I submitted a pull request to minimize the amount of mountain climbing required.
The problem Terra runs into is that it tries to use a registry value to find the location of Visual Studio and then work out where link.exe is from there, then finds the include directories for the C runtime. This hasn’t worked since Visual Studio 2017 and also requires custom handling for each version because compiling an iteration of Visual Studio apparently involves throwing the directory structure into the air, watching it land on the floor in a disorganized mess, and drawing lines between vaguely related concepts. Good for divining the true nature of the C library, bad for building directory structures. Unfortunately, should you somehow manage to compile Terra, it will abruptly stop working the moment you try to call printf, claiming that printf does not actually exist, even after importing stdio.h.
Many Terra tests assume that printf actually resolves to a concrete symbol. This is not true and hasn’t been true since Visual Studio 2015, which turned several stdio.h functions into inline-only implementations. In general, the C standard library is under no obligation to produce an actual concrete symbol for any function - or to make sense to a mere mortal, for that matter. In fact, it might be more productive to assume that the C standard was wrought from the unholy, broiling chaos of the void by Cthulhu himself, who saw fit to punish any being foolish enough to make reasonable assumptions about how C works.
Unfortunately, importing stdio.h does not fix this problem, for two reasons. One, Terra did not understand inline functions on Windows. They were ephemeral wisps, vanishing like a mote of dust on the wind the moment a C module was optimized. A pull request fixed this, but it can’t fix the fact that the Windows SDK was wrought from the innocent blood of a thousand vivisected COMDAT objects. Microsoft’s version of stdio.h can only be described as an extra-dimensional object, a meta-stable fragment of a past universe that can only be seen in brief slivers, never all at once.
Luckily for the Terra project, I am the demonic presence they need, for I was once a Microsoftie. Long ago, I walked the halls of the Operating Systems Group and helped craft black magic to sate the monster’s unending hunger. I saw True Evil blossom in those dark rooms, like having only three flavors of sparkling water and a pasta station only open on Tuesdays.
I know the words of Black Speech that must be spoken to reveal the true nature of Windows. I know how to bend the rules of our prison, to craft a mighty workspace from the bowels within. After fixing the cmake implementation to function correctly on Windows, I intend to perform the unholy incantations required to invoke the almighty powers of COM, so that it may find on which fifth-dimensional hyperplane Visual Studio exists. Only then can I disassociate myself from the mortal plane for long enough to tackle the stdio.h problem. You see, children, programming for Windows is easy! All you have to do is s͏̷E͏l͏̢҉l̷ ̸̕͡Y͏o҉u͝R̨͘ ̶͝sơ̷͟Ul̴
For those of you who actually wish to try Terra, but don’t want to wait for me to fix everything a new release, you can embed the following code at the top of your root Terra script:
if os.getenv("VCINSTALLDIR") ~= nil then terralib.vshome = os.getenv("VCToolsInstallDir") if not terralib.vshome then terralib.vshome = os.getenv("VCINSTALLDIR") terralib.vclinker = terralib.vshome..[[BIN\x86_amd64\link.exe]] else terralib.vclinker = ([[%sbin\Host%s\%s\link.exe]]):format(terralib.vshome, os.getenv("VSCMD_ARG_HOST_ARCH"), os.getenv("VSCMD_ARG_TGT_ARCH")) end terralib.includepath = os.getenv("INCLUDE") function terralib.getvclinker() local vclib = os.getenv("LIB") local vcpath = terralib.vcpath or os.getenv("Path") vclib,vcpath = "LIB="..vclib,"Path="..vcpath return terralib.vclinker,vclib,vcpath end end
Yes, we are literally overwriting parts of the compiler itself, at runtime, from our script. Welcome to Lua! Enjoy your stay, and don’t let the fact that any script you run could completely rewrite the compiler keep you up at night!
The Existential Horror of Terra Symbols
Symbols are one of the most slippery concepts introduced in Terra, despite their relative simplicity. When encountering a Terra Symbol, one usually finds it in a function that looks like this:
TkImpl.generate = function(skip, finish) return quote if [TkImpl.selfsym].count == 0 then goto [finish] end [TkImpl.selfsym].count = [TkImpl.selfsym].count - 1 [stype.generate(skip, finish)] end end
Where selfsym is a symbol that was set elsewhere.
“Aha!” says our observant student, “a reference to a variable from an outside context!” This construct does let you access a variable from another area of the same function, and using it to accomplish that will generally work as you expect, but what it’s actually doing is much worse more subtle. You see, grasshopper, a symbol is not a reference to a variable node in the AST, it is a reference to an identifier.
local sym = symbol(int) local inc = quote [sym] = [sym] + 1 end terra foo() var [sym] = 0 inc inc return [sym] end terra bar() var[sym] = 0 inc inc inc return [sym] end
Yes, that is valid Terra, and yes, the people who built this language did this on purpose. Why any human being still capable of love would ever design such a catastrophe is simply beyond me. Each symbol literally represents not a reference to a variable, but a unique variable name that will refer to any variable that has been initialized in the current Terra scope with that particular identifier. You aren’t passing around variable references, you’re passing around variable names.
These aren’t just symbols, they’re typed preprocessor macros. They are literally C preprocessor macros, capable of causing just as much woe and suffering as one, except that they are typed and they can’t redefine existing terms. This is, admittedly, slightly better than a normal C macro. However, seeing as there have been entire books written about humanity’s collective hatred of C macros, this is equivalent to being a slightly more usable programming language than Brainfuck. This is such a low bar it’s probably buried somewhere in the Mariana Trench.
Terra is C but the Preprocessor is Lua
You realize now, the monstrosity we have unleashed upon the world? The sin Terra has committed now lies naked before us.
Terra is C if you replaced the preprocessor with Lua.
Remember how Terra says you can implement Java-like and Go-like class systems? You can’t. Or rather, you will end up with a pathetic imitation, a facsimile of a real class system, striped down to the bone and bereft of any useful mechanisms. It is nothing more than an implementation of vtables, just like you would make in C. Because Terra is C. It’s metaprogrammable C.
There can be no constructors, or destructors, or automatic initialization, or any sort of borrow checking analysis, because Terra has no scoping mechanisms. The only thing it provides is defer, which only operates inside Lua lexical blocks (do and end)… sometimes, if you get lucky. The exact behavior is a bit confusing, and of course can only be divined by random experimentation because it isn’t documented anywhere! Terra’s only saving grace, the singular keyword that allows you to attempt to build some sort of pretend object system, isn’t actually mentioned anywhere.
Of course, Terra’s metaprogramming is turing complete, and it is technically possible to implement some of these mechanisms, but only if you either wrap absolutely every single variable declaration in a function, or you introspect the AST and annotate every single variable with initialization statuses and then run a metaprogram over it to figure out when constructors or destructors or assignment operators need to be called. Except, this might not work, because the (undocumented, of course) __update metamethod that is supposed to trigger when you assign something to a variable has a bug where it’s not always called in all situations. This turns catching assignments and finding the l-value or r-value status from a mind-bogglingly difficult, herculean task, to a near-impossible trial of cosmic proportions that probably requires the help of at least two Avengers.
There Is No Type System
If Terra was actually trying to build a metaprogramming equivalent to templates, it would have an actual type system. These languages already exist - Idris, Omega, F*, Ada, Sage, etc. but none of them are interested in using their dependent type systems to actually metaprogram low-level code (although F* can produce it). The problem is that building a recursively metaprogrammable type system requires building a proof assistant, and everyone is so proud of the fact they built a proof assistant they forget that dependent type systems can do other things too, like build really fast memcpy implementations.
Terra, on the other hand, provides only the briefest glimpse of a type system. Terra functions enjoy what is essentially a slightly more complex C type system. However, the higher-level Lua context is, well, Lua, which has five basic types: Tables, Functions, Strings, Booleans and Numbers (it also has Thread, Nil, Userdata and CData for certain edge cases). That’s it. Also, it’s dynamic, not static, so everything is a syntax or a runtime error, because it’s a scripting language. This means all your metaprogramming is sprinkled with type-verification calls like :istype() or :isstruct(), except the top came off the shaker and now the entire program is just sprinkles, everywhere. This is fine for when your metaprograms are, themselves, relatively simple. It is not fine when you are returning meta-programs out of meta-meta-functions.
This is the impasse I find myself at, and it is the answer to the question I know everyone wants to know the answer to. For the love of heaven and earth and all that lies between, why am I still using Terra?
The truth is that the project I’m working on requires highly complex metaprogramming techniques in order to properly generate type-safe mappings for arbitrary data structures. Explaining why would be an entire blog post on it’s own, but suffice to say, it’s a complex user interface library that’s intended to run on tiny embedded devices, which means I can’t simply give up and use Idris, or indeed anything that involves garbage collection.
What I really want is a low-level, recursively metaprogrammable language that is also recursively type-safe, in that any type strata can safely manipulate the code of any layer beneath it, preferably via algebriac subtyping that ensures all types are recursively a subset of types that contain them, ad nauseam. This would then allow you to move from a “low-level” language to a “high-level” language by simply walking up the tower of abstraction, building meta-meta-programs that manipulate meta-programs that generate low-level programs.
Alas, such beauty can only exist in the minds of mathematicians and small kittens. While I may one day attempt to build such a language, it will be nothing more than a poor imitation, forever striving for an ideal it cannot reach, cursed with a vision from the gods of a pristine language no mortal can ever possess.
I wish to forge galaxies, to wield the power of computation and sail the cosmos upon an infinite wave of creativity. Instead, I spend untold hours toiling inside LLVM, wondering why it won’t print “Hello World”.
In conclusion, everything is terrible and the universe is on fire.
0 notes