일반화된 plusequals
Source: Hacker News

2026-04-24
Introduction
저는 현재 작업 중인 quarter baked language가 있습니다. 대부분은 형편없지만, 꽤 멋진 구문 아이디어가 떠올랐습니다.
다음은 많은 언어에서 동등하게 동작합니다:
x = x + 1
x += 1
재할당은 렉시컬 스코프이기 때문에 추론하기 쉬워서 좋습니다(변이는 그렇지 않으므로 좋지 않음).
새로운 아이디어는 특수 기호(+= 같은)를 사용하는 대신 키워드(alt)를 일반화하여 모든 중위 연산자에 적용한다는 것입니다. 따라서 다음은 동등합니다:
x = x + 1
alt x + 1
누가 신경 쓰겠어요? 더 짧지도 않잖아요, 그렇죠?
Comparison with Python
l = l[4]=999
l = l[:4] + [999] + l[5:]
그리고:
x = x.n.=2
x = dataclasses.replace(x, n=2)
이제 중첩된 데이터를 몇 개 설정해 보겠습니다:
cat = Cat(age=3)
l = [1, [2, cat], 4]
더 나이가 많은 고양이로 재할당하고 싶다면 이렇게 할 수 있습니다:
alt cat.age.=8
더 흥미로운 예는 원본 고양이를 변형하지 않고, 내부에 있는 고양이를 더 나이 들게 만들기 위해 깊게 중첩된 l을 재할당하는 것입니다:
alt l[1][1].age.=9
이렇게 하면 l은 다음과 같이 됩니다:
[1, [2, Cat(age=9)], 4]
원본 고양이를 변형하지 않기 위해 alt 문이 어떤 설탕(sugar) 코드를 생성했을까요? 대략은 다음과 같습니다:
_1 = l[1] # _1 = [2, Cat(age=3)]
_2 = l[1][1] # _2 = Cat(age=3)
_2 = _2.age.=9 # _2 = Cat(age=9)
_1 = _1[1]=_2 # _1 = [2, Cat(age=9)]
l = l[1]=_1 # l = [1, [2, Cat(age=9)], 4]
제 새로운 언어에는 멋진 feature가 있습니다 — 물결표(~)를 사용해 일반 이진 함수를 중위 형태로 사용할 수 있어, 다음과 같은 재미있는 일을 할 수 있습니다:
alt l~push~5
그 결과 l은 다음과 같이 됩니다:
[1, [2, Cat(age=9)], 4, 5]
Thoughts
- 저는 변이를 좋아하지 않지만, 깊게 중첩된 데이터를 간결하게 업데이트할 수 있는 방법은 좋아합니다. 이 구문을 사용하면 불변 데이터 구조만 있는 언어에서도 귀여움을 구현할 수 있습니다.
- Haskell에서는 어떻게 할까요? 비슷한 구문이 다른 곳에도 있나요?
- 제 언어에 대한 대략적인 계획은: 모든 데이터 구조를 불변이라고 가정하되, 프로그램 구조가 변형 가능한 구현과 동등하다면 컴파일 타임에 성능을 위해 변형 가능한 구현을 사용한다는 것입니다. (이는 Swift의 mutable‑value semantics와는 반대이며, Rust의 borrow checker와 일부 구현 세부 사항을 공유합니다.)
- 어떤 면에서는 older thoughts와 정반대입니다.
- 제 언어에서는 Rust의
?연산자를 일반화한 generalised version도 추가했습니다.