<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ryan Bae</title>
    <description>The latest articles on DEV Community by Ryan Bae (@ryan_bae_5bd7d40241e52c14).</description>
    <link>https://dev.to/ryan_bae_5bd7d40241e52c14</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3672382%2F4b0c2ce0-9f71-471c-b11b-761d53c7b95d.jpg</url>
      <title>DEV Community: Ryan Bae</title>
      <link>https://dev.to/ryan_bae_5bd7d40241e52c14</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ryan_bae_5bd7d40241e52c14"/>
    <language>en</language>
    <item>
      <title>My New Language That’s Almost Done</title>
      <dc:creator>Ryan Bae</dc:creator>
      <pubDate>Mon, 09 Feb 2026 20:10:51 +0000</pubDate>
      <link>https://dev.to/ryan_bae_5bd7d40241e52c14/my-new-language-thats-almost-done-3d31</link>
      <guid>https://dev.to/ryan_bae_5bd7d40241e52c14/my-new-language-thats-almost-done-3d31</guid>
      <description>&lt;p&gt;I’ve been building a programming language for the past 3 months. Although it’s written in Swift, I’m planning to convert my Swift project to Rust. Here are the current specs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can declare variables, constants, and functions&lt;/li&gt;
&lt;li&gt;Has type safety (no type inference)&lt;/li&gt;
&lt;li&gt;Has a “pointer” system for references, but is still broken. This is NOT pointers from C, just pointers pointing to variables&lt;/li&gt;
&lt;li&gt;Can declare structs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sample code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;struct Foo {
  var x: number = 5
  fn test() =&amp;gt; void {
    *self.x = 6
  }
  fn printIt() =&amp;gt; void {
    print(*self.x)
  }
}

var foo: Foo = create Foo()
foo.test()
foo.printIt() // prints 6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub link (don’t mind the username): &lt;a href="https://github.com/Promiuns/Helix" rel="noopener noreferrer"&gt;https://github.com/Promiuns/Helix&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>showdev</category>
      <category>sideprojects</category>
      <category>swift</category>
    </item>
    <item>
      <title>How One Bad Download Corrupted a 5-month Project</title>
      <dc:creator>Ryan Bae</dc:creator>
      <pubDate>Fri, 16 Jan 2026 04:59:27 +0000</pubDate>
      <link>https://dev.to/ryan_bae_5bd7d40241e52c14/how-one-bad-download-corrupted-a-5-month-project-23l6</link>
      <guid>https://dev.to/ryan_bae_5bd7d40241e52c14/how-one-bad-download-corrupted-a-5-month-project-23l6</guid>
      <description>&lt;p&gt;I'm pretty sure you shouldn't be mixing laptop OS's and phone OS's, but here we are. This "bad download" was mainly due to trying to install UIKit onto my macOS project. The problem? UIKit doesn't exist in macOs; the equivalent is AppKit. I tried to force-download (or more accurately, try and do a &lt;code&gt;-Wl...&lt;/code&gt; terminal command), and restarted my computer. It booted up perfectly fine, but when I opened the file... BAM! The dreaded &lt;code&gt;error: linker command failed with exit code 1 (use -v to see invocation)&lt;/code&gt; popped up, not to mention the Canvas/Preview wasn't there. So remember (you probably already know this but...), please never try forcing UIKit to macOS; there's something called AppKit.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>devjournal</category>
      <category>programming</category>
      <category>swift</category>
    </item>
    <item>
      <title>Progress on STAR (EOM)</title>
      <dc:creator>Ryan Bae</dc:creator>
      <pubDate>Sun, 04 Jan 2026 23:03:59 +0000</pubDate>
      <link>https://dev.to/ryan_bae_5bd7d40241e52c14/progress-on-star-eom-4p8h</link>
      <guid>https://dev.to/ryan_bae_5bd7d40241e52c14/progress-on-star-eom-4p8h</guid>
      <description>&lt;h2&gt;
  
  
  Some Context
&lt;/h2&gt;

&lt;p&gt;For one, I've changed the name from EOM (Explicit, Organized, Minimal) to STAR. Another thing, I've mostly finished the expression parser, the AST exec/eval, and now hacking away at the statements.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Changed?
&lt;/h2&gt;

&lt;p&gt;Well, for starters, the language can now parse &lt;code&gt;2+3&lt;/code&gt; to &lt;code&gt;add(2, 3)&lt;/code&gt;, and can now do struct initializers (expression: &lt;code&gt;create Name(Arguments)&lt;/code&gt;) and function calls (expression: &lt;code&gt;Name(Arguments)&lt;/code&gt;). The only things I need to add are now null terms (null(number), null(string)), and mix-fix operators (if _ then _ else _). For the AST, I need to implement the casting case, and the &lt;code&gt;bridge&lt;/code&gt; thing for my language. While STAR is still in development, I made some concepts for STAR v2, v3, and probably v4. Here's some concept code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// async
domain {
    print("Hello!")
}

print("World!") // prints immediately

// explicit scope
scope {
    let thingThatNeedsNewScope = some_function(":)")
    print(thingThatNeedsNewScope)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's some other ideas:&lt;br&gt;
• &lt;code&gt;new(_)&lt;/code&gt; makes a wrapper (&lt;code&gt;domain&lt;/code&gt; or &lt;code&gt;scope&lt;/code&gt;) without any external scope information&lt;br&gt;
• &lt;code&gt;persist&lt;/code&gt; and &lt;code&gt;discard&lt;/code&gt; are manual lifetime keywords; you can extend a variable out of the scope, or delete it from anywhere.&lt;br&gt;
• more math functions&lt;br&gt;
• eventual C++ rewrite&lt;/p&gt;

&lt;p&gt;Suggestions are greatly appreciated!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>coding</category>
    </item>
    <item>
      <title>Why are Unary Operators so Hard?</title>
      <dc:creator>Ryan Bae</dc:creator>
      <pubDate>Sat, 03 Jan 2026 07:06:28 +0000</pubDate>
      <link>https://dev.to/ryan_bae_5bd7d40241e52c14/why-are-unary-operators-so-hard-48k8</link>
      <guid>https://dev.to/ryan_bae_5bd7d40241e52c14/why-are-unary-operators-so-hard-48k8</guid>
      <description>&lt;p&gt;So, if you've ever tried using parsers (whether to make your own language, or make a crazy-good calculator), you've probably been at least partially betrayed by unary operators. Stuff like -x, !flag, or counter++ are just hell for a normal-everyday parser. Don't get me wrong; parsers &lt;em&gt;have&lt;/em&gt; made a way, but the different ways of how they do it is just... very complicated. But why? Why are unary operators so finicky and weird?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Core Problem&lt;/strong&gt;&lt;br&gt;
Unary operators aren't like their binary counterparts (obviously). they take in one input, and spit out a value. But once you actually look at the tokens the parser gets, you'll start to see the problem. Take, for example, 2 + -x.&lt;br&gt;
The lexer returns something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Number(2),
Operator(Add),
Operator(Minus),
Variable("x")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But how do we differentiate -u (unary subtraction) and -b? Let's start simple with Pratt parsing.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
Pratt Parsing is a top-down parser where it starts not knowing the full expression, and it slowly iterates through the expression, gaining more context the more it reveals. Stuff like binary operators are easy; it's just binding power and waiting. but how does it parse -u? Well, Pratt Parsing uses led and &lt;code&gt;nud&lt;/code&gt;: left-denotation and null-denotation. Basically, it's when an operator has a second number (led) or no second number (&lt;code&gt;nud&lt;/code&gt;). When you're trying to use -u, then you would use the &lt;code&gt;nud&lt;/code&gt; version of -.&lt;/p&gt;

&lt;p&gt;For my parser, it uses disambiguation. Basically, if we had something like 7 + -5, it's going to check the last term. if it's a term starter , like an operator, it's a unary operator. If it's a term itself, it's a binary operator. &lt;em&gt;But&lt;/em&gt;, you do need to check for all cases.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>parser</category>
      <category>coding</category>
    </item>
    <item>
      <title>HAPPY NEW YEAR</title>
      <dc:creator>Ryan Bae</dc:creator>
      <pubDate>Thu, 01 Jan 2026 08:11:44 +0000</pubDate>
      <link>https://dev.to/ryan_bae_5bd7d40241e52c14/happy-new-year-1p2d</link>
      <guid>https://dev.to/ryan_bae_5bd7d40241e52c14/happy-new-year-1p2d</guid>
      <description>&lt;p&gt;Welcome to the new 2026! 2025 was a starter to the 2026 meal, so let's dig in and have another great year!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A New Kind of Parser Method</title>
      <dc:creator>Ryan Bae</dc:creator>
      <pubDate>Thu, 01 Jan 2026 00:04:53 +0000</pubDate>
      <link>https://dev.to/ryan_bae_5bd7d40241e52c14/a-new-kind-of-parser-method-1mdb</link>
      <guid>https://dev.to/ryan_bae_5bd7d40241e52c14/a-new-kind-of-parser-method-1mdb</guid>
      <description>&lt;p&gt;I don't know if you heard, but I'm pretty sure you know the method (or the concept) of Pratt parsing. To me, I don't really understand a lot of the concepts of Pratt parsing; binding power and NUD are way out of my league. Nevertheless, it's a really good parsing technique and it's used a lot of times. But I've made another parsing method, more simpler to understand, and at the similar level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the Name?&lt;/strong&gt;&lt;br&gt;
The name for this parsing method is D-M parsing, short for disambiguation-merging parsing. More about the disambiguating and the merging later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the general way of using it?&lt;/strong&gt;&lt;br&gt;
Say you have an expression like this:&lt;br&gt;
&lt;code&gt;2 + foo(4, 5) \* 4 / 23&lt;/code&gt;&lt;br&gt;
Notice that the operators and the terms go in this pattern: term-operator-term-operator, and ends at a term (assuming parenthesis were already resolved). My technique uses that pattern to its advantage:&lt;br&gt;
We can separate those two things into two separate lists; terms and operators. In terms, we list out all the terms in the expression in order, so the terms list would look like the following:&lt;br&gt;
&lt;code&gt;2, foo(4, 5), 4, 23&lt;/code&gt;&lt;br&gt;
And same with the operators, so it looks like this:&lt;br&gt;
&lt;code&gt;+, \*, /&lt;/code&gt;&lt;br&gt;
See another pattern? the terms list is always one element larger than the operator list. Using that, too, we can now make our tree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Make the Tree&lt;/strong&gt;&lt;br&gt;
Now comes the magic- when you group the term elements by pairs (yes, they overlap), you can make the pairs the same as the operator list's length. i.e.:&lt;br&gt;
&lt;code&gt;(2, foo(4, 5)), (foo(4, 5), 4), (4, 23)&lt;/code&gt;&lt;br&gt;
This is crucial for the binary operators.&lt;br&gt;
Now that we have normalized the lists to one length, we pass through the tree. We check the highest precedence (in this case, * and /), and start pairing from there. Now, if we list the operator and term's index, and match the first * with the corresponding pair- &lt;code&gt;foo(4, 5), 4&lt;/code&gt;, we get our first tree- &lt;code&gt;[foo(4, 5), 4]{*}&lt;/code&gt; (note: the curly braces is the operator, the square braces are for the arguments). We then remove the used * and the pair with &lt;code&gt;[foo(4, 5), 4]{*}&lt;/code&gt;.&lt;br&gt;
Currently, we have:&lt;br&gt;
&lt;code&gt;2, [foo(4, 5), 4]{*}, 23&lt;/code&gt; as our terms list. now, we check for the next element with the same precedence; /.&lt;br&gt;
And yeah, keep repeating the process; you should get:&lt;br&gt;
&lt;code&gt;[2, [[foo(4, 5), 4]{*}, 23]{/}]{+}&lt;/code&gt; as the final tree, or in coding terms-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;add (
    2,
    divide (
        multiply (
            foo(4, 5),
            4
        ),
        23
    )
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Okay, But Are There Any Hidden Things?&lt;/strong&gt;&lt;br&gt;
Yes, of course! This way of parsing needs a LOT more than just two lists and a grouper; we need a disambiguation part and a merging part. The disambiguation part is for splitting - into two core types, &lt;code&gt;-u&lt;/code&gt; (unary) and &lt;code&gt;-b&lt;/code&gt; (binary), splitting . into two core types, &lt;code&gt;.n&lt;/code&gt; (numeric/decimal point) and &lt;code&gt;.m&lt;/code&gt; (member access), and splitting ( into two core types, &lt;code&gt;(n&lt;/code&gt; (numeric/grouping opening) and &lt;code&gt;(c&lt;/code&gt; (function call).&lt;/p&gt;

&lt;p&gt;The merger, though, that is one of the hard parts. you need to merge &lt;code&gt;-u x&lt;/code&gt; into &lt;code&gt;-x&lt;/code&gt;, &lt;code&gt;a .m b&lt;/code&gt; into &lt;code&gt;a.b&lt;/code&gt;, and &lt;code&gt;foo .m bar (c 23, 24 ) into foo.bar(23, 24)&lt;/code&gt;. its basically a mini-parser; except for only functions (and maybe a few mix-fix here and there); nothing else.&lt;/p&gt;

&lt;p&gt;Once those two core components have ran, the final output is a list full of terms, operators, and group openers/closers. And, like any other parser, recursively parse those parentheses. Now, with your fully-parsed AST, you're good to go for an expression parser!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>parser</category>
    </item>
    <item>
      <title>Big Project I'm making</title>
      <dc:creator>Ryan Bae</dc:creator>
      <pubDate>Sun, 21 Dec 2025 04:15:10 +0000</pubDate>
      <link>https://dev.to/ryan_bae_5bd7d40241e52c14/big-project-im-making-2b81</link>
      <guid>https://dev.to/ryan_bae_5bd7d40241e52c14/big-project-im-making-2b81</guid>
      <description>&lt;p&gt;&lt;strong&gt;What is My Project?&lt;/strong&gt;&lt;br&gt;
It's a language called EOM thats written in Swift. It's a programming language, and it's about 30% done. It uses its own paradigm (because OOP has various pitfalls like the diamond problem and the fragile base class), and it's going to have similar but different enough syntax from Swift.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Okay, but what does the syntax look like?&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// examples
// if statements
if x == 5 {
    print("Hello, World")
} else {
    print("Bye, World")
}

// paradigm
struct A {
    var foo: number
}

copy A =&amp;gt; B {
    add var bar: string = "This is a test"
}

let temp: B = B()
print(temp.bar) // prints "This is a test"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why are you making it?&lt;/strong&gt;&lt;br&gt;
This project is for my 2026 submission for the Swift Student Challenge (I haven't done it before, so this is first time, lol). &lt;/p&gt;

&lt;p&gt;I'm still working on the AST design, but I'm starting to get into the parser side, and I'm open to feedback from people interested in programming language design. Thank you!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>swift</category>
    </item>
  </channel>
</rss>
