Lens에 대해서 글을 써 볼까... 아니면 SMT에 대해서 글을 써 볼까... 이런 고민은 끊이질 않는다 😵
도막도
@domatdo@hackers.pub · 46 following · 39 followers
규칙을 만들고, 부수고, 살펴보고, 고치기를 좋아합니다. 논리를 다루는 일이 즐거워 프로그래밍을 업으로 삼았습니다. 현재는 프론트엔드 플랫폼 엔지니어로 일하고 있습니다.
다음 주제에 특히 관심이 많습니다.
- 프로그래밍 언어론
- 타입 이론
- 소프트웨어 아키텍쳐
- 글쓰기 그리고 맥주와 와인
GitHub
- @ENvironmentSet
blog
- overcurried.com
@ailrunAilrun (UTC-5/-4) 늦었지만 Lens에 저도 한 표 올려봅니다.
@bglbgl gwyng 메시지 패싱이 함수 호출보다 더 근본적인 요소라고 저는 생각합니다. RPC 프레임워크만 봐도 함수 호출을 메시지 패싱으로 구현할 수 있는 것은 자명하죠. 그래서 함수 호출은 메시지 패싱의 특수한 형태로 보아야 한다 생각합니다.
@bglbgl gwyng 한편으로는 단순 함수 호출로 모델링하기 어려운 상호작용도 있습니다. 일대 다 통신이나 다대 다 통신, 스트리밍 등이 그러하지요. 함수를 사용해서 이들을 모델링하는게 불가능하지는 않겠지만 메시지 패싱으로 모델링하는 것보다 단순하지는 않으리라 생각합니다.
@bglbgl gwyng 가장 원하시는 답은 함수 호출과 메시지 패싱이 근본적으로 어떻게 다르냐?는 것이 될 텐데요. 이따 퇴근하면서 덧붙여보도록 하겠습니다.
@bglbgl gwyng 메시지 패싱이 함수 호출보다 더 근본적인 요소라고 저는 생각합니다. RPC 프레임워크만 봐도 함수 호출을 메시지 패싱으로 구현할 수 있는 것은 자명하죠. 그래서 함수 호출은 메시지 패싱의 특수한 형태로 보아야 한다 생각합니다.
이론적으론 자바는 반쪽짜리 OOP인가 봅니다. 모든 건 객체고, 객체들끼리 함수 호출이 아닌 메시지 패싱을 해야되고, 이 메시지들 처리 방식을 객체가 능동적으로 결정해야 Pure OOP라 부르나 봅니다. 어디까지나 이론적인 얘기입니다. 스몰토크나, 아니면 얼랭등을 만져봤으면 더 쉽게 이해할 것 같은데요. 낮에 객체 지향 얘기가 보여 교양 공부 해봤습니다.
@lionhairdino 자바에서도 기본적인 것은 다 됩니다. 객체지향 프로그래밍을 가능하게 하는 최소 요건을 맞추는 것은 어렵지 않아요. ‘잘‘ 갖추는 것과 사용자들이 그것을 적절히 쓰게 만드는 게 어려운 거고 많은 자바 레거시는…후략
@bglbgl gwyng 월드 와이드 웹에 누구든 웹 서비스를 연결하고 수정하고 분리할 수 있는 것은, 그 과정에서 웹이 절대 망가지지 않는 것은, 상당 부분 월드 와이드 웹이 기초한 프로토콜이 메시지 패싱에 기반하고 있기 때문입니다.
@bglbgl gwyng 가장 원하시는 답은 함수 호출과 메시지 패싱이 근본적으로 어떻게 다르냐?는 것이 될 텐데요. 이따 퇴근하면서 덧붙여보도록 하겠습니다.
@domatdo도막도 넵 그렇습니다. 제가 처음에 올린 단문도 객체지향이 설계에 실질적으로 도움이 되는 사례를 나열해보면 상속을 벗어나지 않는다는 주장이었습니다. 메시지 패싱으로 어떤 설계 문제를 해결했다,는 사례를 저는 아직 모르고, 최소한 잘 알려지지 않은거 같습니다.
@bglbgl gwyng 월드 와이드 웹에 누구든 웹 서비스를 연결하고 수정하고 분리할 수 있는 것은, 그 과정에서 웹이 절대 망가지지 않는 것은, 상당 부분 월드 와이드 웹이 기초한 프로토콜이 메시지 패싱에 기반하고 있기 때문입니다.
@domatdo도막도 그렇다면 저는 메시지 패싱을 잘 활용한 코드의 예시를 보면 설득이 될거 같네요. 저는 그것이 메소드 호출 이상의 의미를 갖는지에 대해 아직 회의적입니다.
@bglbgl gwyng 함수 호출 이상의 의미를 갖는지 의문이라는 말씀이신 거죠?
@domatdo도막도 메시지 패싱은 잘은 모르지만 그런게 있다는건 알고는 있습니다. 그렇다면 Java가 메시지 패싱을 어떻게 지원한다고 할수 있을까요? 또 그걸로 어떻게 설계의 이점을 얻을까요?
@bglbgl gwyng 취급할 수 있는 메시지를 정의하는 방법으로 인터페이스(그리고 메서드 시그니처 선언)을, 메시지 처리 동작을 정의하는 방법으로 메서드 정의를 제공합니다. 메시지 패싱은 복잡계가 외부와 상호작용(~협력)하는 방법으로 작동하고, 이러한 복잡계에게 적절한 역할과 자율성을 부여하면 1) 덜 복잡해서 이해하기 쉬운 구조적인 프로그램을 만들 수 있고 2) 최소한(단순히 코드의 양을 이야기한다기보다는 모듈 수를 비롯한 변경점의 복잡도를 이야기한다 봐주시는게 정확할 겁니다.)의 수정으로 변화에 대응할 수 있는 프로그램을 만들 수 있습니다.
@bglbgl gwyng 객체지향 프로그래밍의 핵심이 메시지 패싱이라는 개념이라는 것은 여러 객체지향 언어를 비교해보면 명확하게 확인할 수 있습니다. 상속, 상태, 접근자, 접근 제한자, 클래스, 프로토타입, 멤버 변수, this 바인딩, 메서드 디스패치 등등 다양한 개념이 여러 언어에서 서로 다르게 나타나는 한편 메시지 패싱이라는 아이디어는 변치 않습니다.
@bglbgl gwyng 객체지향 프로그래밍의 잘못된 적용례로 단순 구조체에 불과한 객체를 양산하는 상태 주도 개발을 꼽는 것도 동일한 맥락에서입니다. 메시지 패싱 없는 객체지향 프로그래밍은 객체지향 프로그래밍이 아니어요.
@bglbgl gwyng (답문이 너무 짧아서 노파심에 덧붙이지는 말입니다만 오해의 여지를 안 만들기 위해 최대한 드라이하게 이야기하려고 노력중이라 여겨주시면 좋겠습니다..ㅎㅎ)
@bglbgl gwyng 객체지향 프로그래밍의 핵심이 메시지 패싱이라는 개념이라는 것은 여러 객체지향 언어를 비교해보면 명확하게 확인할 수 있습니다. 상속, 상태, 접근자, 접근 제한자, 클래스, 프로토타입, 멤버 변수, this 바인딩, 메서드 디스패치 등등 다양한 개념이 여러 언어에서 서로 다르게 나타나는 한편 메시지 패싱이라는 아이디어는 변치 않습니다.
@bglbgl gwyng 메서드에 기반한 메시지 패싱 매커니즘과 인터페이스라는 개념을 제공합니다.
@bglbgl gwyng (답문이 너무 짧아서 노파심에 덧붙이지는 말입니다만 오해의 여지를 안 만들기 위해 최대한 드라이하게 이야기하려고 노력중이라 여겨주시면 좋겠습니다..ㅎㅎ)
@domatdo도막도 좋은 책 추천 감사합니다! 그런데 제가 의심하는게 사실 '객체와 그것들의 협력에 대한 이야기' 요 부분입니다. 가령 Java와 같은 객체지향 패러다임의 언어 프로그래밍 언어가 실제로 객체들의 협력을 위해 언어적으로 어떤 기능을 지원하나요? 저는 그런 기능이 딱히 없다고보고, 그래서 1. Java는 객체지향 언어가 아니다 2. 객체지향 패러다임은 (실질적으로) 그 문제와 별로 관련이 없다. 두 결론 중 하나를 택해야 한다고 생각합니다.
@bglbgl gwyng 메서드에 기반한 메시지 패싱 매커니즘과 인터페이스라는 개념을 제공합니다.
도막도 shared the below article:
논리적이 되는 두 가지 방법 - 논리와 저수준(Low-level) 자료 표현(Data representation) (2 편 중 1 편)

Ailrun (UTC-5/-4) @ailrun@hackers.pub
이 글은 어떤 문장이 "논리적"이라고 할 수 있는지에 대한 심도 있는 탐구를 시작합니다. 일상적인 오용을 지적하며, 진정으로 논리적인 주장은 증명 가능성과 체계의 무모순성이라는 두 가지 핵심 조건을 충족해야 한다고 주장합니다. 특히, "좋은 가정 아래" 논리성을 증명하는 두 가지 방법, 즉 함수형 언어와 유사한 구조를 가진 자연 연역과, 약간의 "부정행위"를 통해 무모순성을 쉽게 보일 수 있는 논건 대수를 소개합니다. 글에서는 명제와 판단의 개념을 명확히 정의하고, 자연 연역을 통해 논리적 증명을 구축하는 방법을 상세히 설명합니다. 특히, 자연 연역과 함수형 언어 간의 놀라운 유사성, 즉 커리-하워드 대응을 통해 논리적 사고와 프로그래밍 언어 이해 사이의 연결고리를 제시합니다. 또한, 자연 연역의 한계를 극복하고 무모순성을 보다 쉽게 증명할 수 있는 논건 대수를 소개하며, 자연 연역과의 구조적 차이점을 강조합니다. 이 글은 논리적 사고의 깊이를 더하고, 프로그래밍 언어와 논리 간의 관계에 대한 흥미로운 통찰을 제공합니다. 특히, 커리-하워드 대응을 통해 논리와 프로그래밍이 어떻게 연결되는지 이해하고 싶은 독자에게 유익할 것입니다.
Read more →함수형 프로그래밍과 객체지향 프로그래밍은 상호 배제적인 패러다임이 아니다.
@bglbgl gwyng 저는 반대로 상속을 빼놓고도 객체지향을 이야기할 수 있고, 더 나아가서는 응당 그래야 한다고 생각합니다. 상속은 객체지향 프로그래밍을 추구하는 프로그래밍 언어들이 자주 채택한 구현 기법 그 이상 그 이하도 아니지요. 중요한 것은 복잡계를 객체로 모델링하고, 또 그 복잡계를 적절히 조합해 복잡도를 제어하는 일입니다. 객체지향은 객체와 그것들의 협력에 대한 이야기가 되어야 하지 그 외에 어떤 구현 디테일에 대한 이야기가 되어서는 안 된다고 생각해요.
@bglbgl gwyng 조영호님의 <오브젝트>를 강하게 추천드려요.
방금 하스켈 학교에서 객체지향 vs 함수형 떡밥이 n번째로 돌았는데, 나는 그냥 객체지향 = 상속(서브타이핑) 이라고 생각한다. 객체지향에서 상속을 빼면 뭐 남는게 없다. 그래서 객체지향이란 단어를 의미있게 사용하려면 상속이랑 동치시켜 사용할수 밖에 없다고 본다.
근데 상속은 코드를 합성하는 수많은 방법중 하나일 뿐이다. Java같은 언어는 그 수많은 방법중 딱 하나 상속만을 언어 자체에서 지원하는거고, 거기서 벗어나는 다른 유용한 추상화들은 죄다 디자인 패턴이라고 퉁쳐서 부른다. 그래서 객체지향 vs 함수형(= 상속 vs 함수형)은, 나에겐 Monoid vs 타입클래스 같은 비교처럼 들린다. 좌변과 우변이 체급이 안 맞아서 대결이 불성립한다.
@bglbgl gwyng 저는 반대로 상속을 빼놓고도 객체지향을 이야기할 수 있고, 더 나아가서는 응당 그래야 한다고 생각합니다. 상속은 객체지향 프로그래밍을 추구하는 프로그래밍 언어들이 자주 채택한 구현 기법 그 이상 그 이하도 아니지요. 중요한 것은 복잡계를 객체로 모델링하고, 또 그 복잡계를 적절히 조합해 복잡도를 제어하는 일입니다. 객체지향은 객체와 그것들의 협력에 대한 이야기가 되어야 하지 그 외에 어떤 구현 디테일에 대한 이야기가 되어서는 안 된다고 생각해요.
도막도 shared the below article:
논리와 메모리 - 논리와 저수준(Low-level) 자료 표현(Data representation) (2 편 중 2 편)

Ailrun (UTC-5/-4) @ailrun@hackers.pub
이 글은 "논리적"이 되는 두 번째 방법인 논건 대수를 재조명하며, 특히 컴퓨터 공학적 해석에 초점을 맞춥니다. 기존 논건 대수의 한계를 극복하기 위해, 컷 규칙을 적극 활용하는 반(半)공리적 논건 대수(SAX)를 소개합니다. SAX는 추론 규칙의 절반을 공리로 대체하여, 메모리 주소와 접근자를 활용한 저수준 자료 표현과의 커리-하워드 대응을 가능하게 합니다. 글에서는 랜드(∧)와 로어(∨)를 "양의 방법", 임플리케이션(→)을 "음의 방법"으로 구분하고, 각 논리 연산에 대한 메모리 구조와 연산 방식을 상세히 설명합니다. 특히, init 규칙은 메모리 복사, cut 규칙은 메모리 할당과 초기화에 대응됨을 보여줍니다. 이러한 SAX의 컴퓨터 공학적 해석은 함수형 언어의 저수준 컴파일에 응용될 수 있으며, 논리와 컴퓨터 공학의 연결고리를 더욱 강화합니다. 프랭크 페닝 교수의 연구를 바탕으로 한 SAX는 현재도 활발히 연구 중인 체계로, ML 계열 언어 컴파일러 개발에도 기여할 수 있을 것으로 기대됩니다.
Read more →문제에서 복잡한 부분을 잘 발견하는 건지, 그냥 문제를 복잡하게 만드는 것을 잘 하는 건지 헷갈린다. 둘을 유의미하게 구별하고 싶은데.
논리와 low-level data representation을 다뤄볼지, 아니면 함수형 추상 기계들(Turing Machine같은 것이지만 함수형을 위한 것들)을 다뤄볼지
@ailrunAilrun (UTC-5/-4) 저도 함수형 추상 기계가 더 궁금해요. 다양한 시선에서 코드를 이해해보고 싶네요.
사람이라는 게 참 묘하다. 서비스 개발을 시키면 플랫폼 엔지니어링을 하고 싶고, 플랫폼 엔지니어링을 시키면 서비스 개발을 하고 싶어한다. 둘 다 해야 할 때는 이론 공부를 하고 싶다고 하고, 이론 공부를 시키면 서비스 개발을 하고 싶다고 한다.
주어가 계속 바뀌는 이상한 문장인데, 그래서인지 더 마음에 들어서 올렸다. 역시 사람 마음이라는 것은 "내 이야기는 아니고 아는 친구의 친구 이야기인데" 같은 걸로는 쉽게 숨기기 어렵다.
사람이라는 게 참 묘하다. 서비스 개발을 시키면 플랫폼 엔지니어링을 하고 싶고, 플랫폼 엔지니어링을 시키면 서비스 개발을 하고 싶어한다. 둘 다 해야 할 때는 이론 공부를 하고 싶다고 하고, 이론 공부를 시키면 서비스 개발을 하고 싶다고 한다.
For my library and CLI projects, I've been writing documentation before writing any code. It helps me imagine the final interface early on, which usually leads to better design. Sure, sometimes I miss implementation details and have to revise later, but hey—it's just docs. Docs are easy to change.
This tiny habit has surprisingly big payoffs. When I focus on how things will be used rather than how they'll be built, I end up with interfaces that actually make sense.
Anyone else do this? Curious about your experience with documentation-first approaches.
RE: https://hollo.social/@hongminhee/01964c76-ef1e-7994-b3f0-57f967742566
@hongminhee洪 民憙 (Hong Minhee) I never start writing code before I gather enough context for the problem. Listening to possible customer's voices and collecting prior arts are one of the most important part of designing solutions.
@domatdo도막도 그 둘은 같습니다만
thunk
에 congruence rule이 없습니다. 즉 M = L
이어도 thunk(M) = thunk(L)
인 것은 아닙니다. (M
을 계산한 결과가 L
인 경우, thunk(M)
은 지연된 계산이기 때문에 더이상 평가가 진행되지 않아 thunk(L)
이 될 수 없습니다.)
@ailrunAilrun (UTC-5/-4) 아!! 이 지점을 놓치고 있었네요. 감사합니다.
@ailrunAilrun (UTC-5/-4) (force . thunk) m = m이라 볼 수 있지 않았나요?
@ailrunAilrun (UTC-5/-4) 정확한 의미론을 보면 알 수 있겠네요. 아침에 일어나서 한 번 살펴봐야겠습니다 ㅎㅎ
@domatdo도막도
thunk . force
가 좀 난해한 녀석이죠. thunk
를 LISP의 quasi quotation으로, force
를 back quotation으로 이해하면 thunk . force
는 항등입니다만, thunk
를 그냥 지연된 계산으로 이해하면 thunk (M)
은 지연된 M
계산이고 thunk (force (thunk (M)))
은 지연된 force (thunk (M))
계산이라 같다고 하기 미묘합니다. 이 맥락에서 같다는 두 프로그램이 실행되어서 문법적으로 동일한 결과 값을 준다는 이야기일 때요.
@ailrunAilrun (UTC-5/-4) (force . thunk) m = m이라 볼 수 있지 않았나요?
@domatdo도막도 다른 말로는
Up (Down a)
는 모나드(Monad)고 Down (Up a)
는 코모나드(Comonad)가 되는데요, 이를 이용해 CBPV는 Effect 또한 자연스럽게 다룰 수 있습니다. 글에서 다루기에는 소개할 내용이 많아서 생략했지만요.
@ailrunAilrun (UTC-5/-4) 어쩐지 effect system 문서를 보면 CBPV 언급을 자주 하던데 이런 배경이 있었군요. 한 번 찾아봐야겠어요.
@domatdo도막도 그리고
force . thunk
는 항등사상이 맞습니다. M
은 M
이라는 계산을 하는 녀석이고, force (thunk (M))
도 정확히 M
이라는 계산을 하는 녀석이죠.
@ailrunAilrun (UTC-5/-4) 아, thunk . force라고 해야 했는데 force . thunk라 했네요..! 그리고 다시 생각하니 thunk . force도 항등 사상이 맞군요…
PostHog 뉴스레터는 중소규모 팀 맞춤형(즉, 사이드프로젝트 물주는 사람들한테도 좋은..)으로 좋은 내용이 많아서 새 글이 올라올때마다 여기에도 자주 공유하고 싶음
@kodingwarriorJaeyeol Lee 회사에서 posthog을 적극적으로 도입하면서 퀄리티에 많이 놀랐는데 마인드셋이 대단한 팀이었네요. 자주 공유해주시면 큰 도움이 되겠어요. 물론 저도 지금 구독하러 갑니다..~
@ailrunAilrun (UTC-5/-4) 생각해보면 return도 두 언어를 오가는 대응에 해당하네요. 모든 값을 계산으로 바꾼다는 점에서 force보다도 더 thunk의 짝이 되기 좋아보이나 싶지만 조금만 더 생각해보면 둘을 합성해서 항등 사상을 얻을 수가 없으니 아주 잘 어울리는 한 쌍은 못 되는군요. 뭔가 to의 역할을 잘 생각해보면 보이는 게 있을 거 같은데… 고민해봐야겠어요.
@ailrunAilrun (UTC-5/-4) 재밌게도 force . thunk랑 return . thunk 모두 항등 사상이 못 되네요. 이건 값이 ‘~인 것‘이기 때문일까요? ~인 것을 갖고 무언가를 더 하기 위해서 return과 to가 있는 것인가 싶어졌어요.
@ailrunAilrun (UTC-5/-4) 아하. CBPV의 thunk와 force를 일반화하면 두 언어 사이에서 항을 변환하는 사상을 떠올릴 수 있겠네요. 메타프로그래밍 관점에서 생각하면 항을 메타 언어의 데이터로 바꾸는 생성자(lisp의 quote 같은)와 메타 언어의 데이터를 대상 언어의 항으로 되돌리는 eval 생성자를 생각할 수도 있겠어요. 더 흥미로워지는데요?
@ailrunAilrun (UTC-5/-4) 생각해보면 return도 두 언어를 오가는 대응에 해당하네요. 모든 값을 계산으로 바꾼다는 점에서 force보다도 더 thunk의 짝이 되기 좋아보이나 싶지만 조금만 더 생각해보면 둘을 합성해서 항등 사상을 얻을 수가 없으니 아주 잘 어울리는 한 쌍은 못 되는군요. 뭔가 to의 역할을 잘 생각해보면 보이는 게 있을 거 같은데… 고민해봐야겠어요.
@domatdo도막도 수반 논리(Adjoint Logic)에 기반한 언어간 상호운용성(interoperability)입니다. CBPV를 이 관점에서 이해하면 계산 언어와 값 언어간의 상호운용성을 특정한 방식으로 구현했다고 볼 수 있습니다. CBPV가 수반 논리보다는 제한적인 대신 그 제한이 기계 수준에서 이해하는데는 유용한 점이 있다고 비교해 볼 수 있겠네요.
@ailrunAilrun (UTC-5/-4) 아하. CBPV의 thunk와 force를 일반화하면 두 언어 사이에서 항을 변환하는 사상을 떠올릴 수 있겠네요. 메타프로그래밍 관점에서 생각하면 항을 메타 언어의 데이터로 바꾸는 생성자(lisp의 quote 같은)와 메타 언어의 데이터를 대상 언어의 항으로 되돌리는 eval 생성자를 생각할 수도 있겠어요. 더 흥미로워지는데요?
@domatdo도막도 저 개인적으로는 CBPV랑 경쟁하는(?) 체계를 연구하고 있다보니 CBPV의 약진이 맘에는 안 듭니다만
@ailrunAilrun (UTC-5/-4) 연구하고 계신 체계는 어떤 체계인가요?
도막도 shared the below article:
함수형 언어의 평가와 선택

Ailrun (UTC-5/-4) @ailrun@hackers.pub
이 글은 함수형 언어의 핵심 개념을 람다 대수를 통해 소개하며, 함수형 언어의 평가 방식에 대한 깊이 있는 이해를 제공합니다. 람다 대수의 기본 요소인 변수, 함수, 함수 호출을 설명하고, 값에 의한 호출(CBV)과 이름에 의한 호출(CBN)의 차이점을 명확히 분석합니다. 특히, 폴 블레인 레비의 "값 밀기에 의한 호출(CBPV)"을 소개하며, 이 방식이 CBV와 CBN을 모두 포괄할 수 있는 강력한 도구임을 강조합니다. CBPV가 함수와 함수 호출을 스택 기반으로 어떻게 다르게 해석하는지, 그리고 이를 통해 람다 대수를 기계 수준으로 컴파일할 때 얻을 수 있는 이점을 설명합니다. 항수 분석과 같은 최적화 기법을 CBPV를 통해 어떻게 더 명확하게 표현할 수 있는지 보여주며, GHC 컴파일러의 중간 언어로서 CBPV의 중요성을 부각합니다. 이 글은 함수형 언어의 깊은 이론적 배경과 실제 컴파일러 구현 사이의 연결고리를 탐구하고자 하는 독자에게 유용한 통찰력을 제공합니다.
Read more →도막도 replied to the below article:
함수형 언어의 평가와 선택

Ailrun (UTC-5/-4) @ailrun@hackers.pub
이 글은 함수형 언어의 핵심 개념을 람다 대수를 통해 소개하며, 함수형 언어의 평가 방식에 대한 깊이 있는 이해를 제공합니다. 람다 대수의 기본 요소인 변수, 함수, 함수 호출을 설명하고, 값에 의한 호출(CBV)과 이름에 의한 호출(CBN)의 차이점을 명확히 분석합니다. 특히, 폴 블레인 레비의 "값 밀기에 의한 호출(CBPV)"을 소개하며, 이 방식이 CBV와 CBN을 모두 포괄할 수 있는 강력한 도구임을 강조합니다. CBPV가 함수와 함수 호출을 스택 기반으로 어떻게 다르게 해석하는지, 그리고 이를 통해 람다 대수를 기계 수준으로 컴파일할 때 얻을 수 있는 이점을 설명합니다. 항수 분석과 같은 최적화 기법을 CBPV를 통해 어떻게 더 명확하게 표현할 수 있는지 보여주며, GHC 컴파일러의 중간 언어로서 CBPV의 중요성을 부각합니다. 이 글은 함수형 언어의 깊은 이론적 배경과 실제 컴파일러 구현 사이의 연결고리를 탐구하고자 하는 독자에게 유용한 통찰력을 제공합니다.
Read more →@ailrunAilrun (UTC-5/-4) 람다 대수 스펙이 있다면 축약 방법은 Unspecified behavior라고 볼 수 있겠네요. 이곳저곳에서 Call-By-Push-Value를 자주 언급해서 궁금하던 찰나였는데 친절하게 설명해주신 덕분에 편하게 이해할 수 있었습니다. 늘 감사합니다.
Yacc와 같은 파서 제네레이터에 BNF를 넣으면 파서 코드가 자동으로 생성된다. 그런데 HTTP나 ActivityPub 등의 프로토콜 스펙을 입력으로 넣으면 자동으로 코드를 구현해주는 도구 어디 없나?
@curry박준규 스펙을 입력으로 넣으면 자동으로 코드를 구현해주는 도구가 있긴 합니다. '컴파일러'라고 하죠. (농담입니다 ㅋㅋㅋ)
Facebook에서 특히 자주 발생하는 문제지만 그렇다고 다른데에서 안 터지는 것도 아니라 참 답답
@ailrunAilrun (UTC-5/-4) 저는 그래서 긴 글을 쓸 때에는 메모장에 적어서 옮겨요. 페이스북 같은 환경에서 앱이 고장나거나 잘못 눌러 발생한 네비게이션으로 작성한 컨텐츠가 날라가는 일도 피할 수 있어서 좋아요.
도막도 shared the below article:
같은 것을 알아내는 방법

Ailrun (UTC-5/-4) @ailrun@hackers.pub
이 글은 일상적인 질문에서부터 컴퓨터 과학의 핵심 문제에 이르기까지, '같음'이라는 개념이 어떻게 적용되고 해석되는지를 탐구합니다. 특히, 두 프로그램이 '같은지'를 판정하는 문제에 초점을 맞춰, 문법적 비교와 $\beta$ 동등성이라는 두 가지 접근 방식을 소개합니다. 문법적 비교는 단순하지만 제한적이며, $\beta$ 동등성은 프로그램의 실행을 고려하지만, 계산 복잡성으로 인해 적용이 어렵습니다. 이러한 어려움에도 불구하고, 의존 형 이론에서의 형 검사(변환 검사)는 $\beta$ 동등성이 유용하게 활용될 수 있는 중요한 사례임을 설명합니다. 이 글은 '같음'의 개념이 프로그래밍과 타입 이론에서 어떻게 중요한 역할을 하는지, 그리고 이 개념을 올바르게 이해하고 구현하는 것이 왜 중요한지를 강조하며 마무리됩니다.
Read more →