ㅋㅋㅋ 뭔가 “답정너" 느낌이 있는데요. 댓글 여론과 다른 ... 농담입니다. 전혀 불만 없이 기다리고 있겠습니다.
@ailrunAilrun (UTC-5/-4)
Ailrun (UTC-5/-4)
@ailrun@hackers.pub · 3 following · 44 followers
소개 - Who Am I?
- 개발자/연구원
- Haskell Language Server Admin
- PL Theorist
- Logician
- 중증 맥덕
근황 - Recent Interests
- 언어간 상호운용성(Interoperability) 연구 중
- 의존적 형이론(dependent type theory) 연구 중
- 효율적인 레이텍 조판(LaTeX Typesetting) 공부 중
- Québec 에서 제일 맛있는 Stout 마시는 중
GitHub Page
- ailrun.github.io/ko
GitHub
- @Ailrun
@lionhairdino 예를 들면 "다양한 시선에서 코드를 이해한다"가 지금 공개한 연작의 2 편에서 논건 대수를 통한 계산의 이해와도 밀접한 연관이 있다고 읽혔습니다. 원래 두번째 주제에 대해서 쓰다가 방향성을 틀었네요.
@bglbgl gwyng 자연 연역, 즉 함수형 언어에서 (치환을 통해) "더 간단한 증명"을 해서 본문에 등장하는 문제를 피할 수 있는 것처럼 논건(論件) 대수에서도 (cut이 없는) "더 간단한 증명"을 할 수 있다는 이야기였습니다. 본문에서 설명이 조금 부족했던 것 같네요.
@bglbgl gwyng 현재는 좀 더 명확하도록 수정했습니다.
@ailrunAilrun (UTC-5/-4) 좋은 글 감사합니다!
저런 식의 증명 대신 L에서 x가 등장하는 자리에 M을 치환해넣고, y가 등장하는 자리에 N을 치환해넣은 증명 또한 가능하기 때문이다. 이 직관을 구체화한 것이 바로 다음의 cut 제거 정리이다.
요부분이 좀 헷갈리는데요, 글에서 소개된 Sequent Calculus에서는 치환에 대한 설명이 없는 것으로 보입니다. 함수형 언어에서의 치환에 해당하는 Sequent Calculus에서의 규칙이 추가로 필요한데 생략하신 걸까요, 아니면 글의 내용만으로 설명가능한데 제가 뭔가 놓친걸까요?
@bglbgl gwyng 자연 연역, 즉 함수형 언어에서 (치환을 통해) "더 간단한 증명"을 해서 본문에 등장하는 문제를 피할 수 있는 것처럼 논건(論件) 대수에서도 (cut이 없는) "더 간단한 증명"을 할 수 있다는 이야기였습니다. 본문에서 설명이 조금 부족했던 것 같네요.
논리와 저수준(Low-level) 자료 표현(Data representation)에 대한 글 2 편 중 첫째 편입니다. "논리적이 되는 두 가지 방법"이라는 부제로 논리적 증명을 하는 두 방법론에 대해서 다뤄보았습니다. 이 중 하나의 방법론이 둘째 편의 핵심이 될 예정입니다.
에디터의 플러그인도 Nix로 관리하고 싶다. 에디터 쪽에서 지원을 해야하는데, 누군가 총대매고 해줄법도 한데...
@bglbgl gwyng Emacs는 지원하는 걸로 압니다. 그래도 Native 설정이 훨씬 편하지만요.
논리적이 되는 두 가지 방법 - 논리와 저수준(Low-level) 자료 표현(Data representation) (2 편 중 1 편)
Ailrun (UTC-5/-4) @ailrun@hackers.pub
이 글은 어떤 문장이 "논리적"이라고 할 수 있는지에 대한 심도 있는 탐구를 시작합니다. 일상적인 오용을 지적하며, 진정으로 논리적인 주장은 증명 가능성과 체계의 무모순성이라는 두 가지 핵심 조건을 충족해야 한다고 주장합니다. 특히, "좋은 가정 아래" 논리성을 증명하는 두 가지 방법, 즉 함수형 언어와 유사한 구조를 가진 자연 연역과, 약간의 "부정행위"를 통해 무모순성을 쉽게 보일 수 있는 논건 대수를 소개합니다. 글에서는 명제와 판단의 개념을 명확히 정의하고, 자연 연역을 통해 논리적 증명을 구축하는 방법을 상세히 설명합니다. 특히, 자연 연역과 함수형 언어 간의 놀라운 유사성, 즉 커리-하워드 대응을 통해 논리적 사고와 프로그래밍 언어 이해 사이의 연결고리를 제시합니다. 또한, 자연 연역의 한계를 극복하고 무모순성을 보다 쉽게 증명할 수 있는 논건 대수를 소개하며, 자연 연역과의 구조적 차이점을 강조합니다. 이 글은 논리적 사고의 깊이를 더하고, 프로그래밍 언어와 논리 간의 관계에 대한 흥미로운 통찰을 제공합니다. 특히, 커리-하워드 대응을 통해 논리와 프로그래밍이 어떻게 연결되는지 이해하고 싶은 독자에게 유익할 것입니다.
Read more →논리와 low-level data representation을 다뤄볼지, 아니면 함수형 추상 기계들(Turing Machine같은 것이지만 함수형을 위한 것들)을 다뤄볼지
말씀하신 것들을 보아 몇몇 분들은 실제 내용 측면에서는 논리와 저수준 자료표현에 더 관심을 가질 분들이 있는 것 같아 전자를 (먼저?) 다뤄보도록 하겠습니다. 2 편으로 나눠져 올라갈 예정입니다.
완전한 검정 배경에 하얀 글자는 대비가 높아, 눈에 잔상이 남습니다. 눈의 피로를 덜기 위해 다크 모드를 주 톤으로 선택했다면, 대비를 적당 수준으로 낮춰야 합니다. 나이가 올라갈 수록 영향을 받습니다. 모르시는 분들이 많은 것 같습니다.
@lionhairdino 잔상도 그렇고 대비가 극명하면 빛 번짐 때문에 글씨 가독성도 떨어지죠. 이런 부분을 잘 배려하는 좋은 색 디자인(design)이 많아졌으면 합니다.
논리와 low-level data representation을 다뤄볼지, 아니면 함수형 추상 기계들(Turing Machine같은 것이지만 함수형을 위한 것들)을 다뤄볼지
9.6 전에는 실수로 허용되던 것이란 말이 나와, 학문적 정 부 의 가치가 있는 줄 알았습니다.
@ailrunAilrun (UTC-5/-4)
@bglbgl gwyng
@lionhairdino
@bglbgl gwyng 원하는 기능(GADTs)과 모순된다는 점에서는 "비정상"이기는 하죠.
답 댓글이 아니라, 질문 댓글입니다. 레코드 업데이트 하는 동안에 반드시 레코드 타입을 먼저 알아야 한다는 게 "정상"이라는 거지요?
bar :: T Int
-- bar = emptyT --- 허용
bar = emptyT { x = [3] } --- 레코드 업데이트 중에는 타입 specialize를 못하니 불가
@lionhairdino
@bglbgl gwyng 어느 쪽이 더 "정상이다"가 아니라, GADTs의 Record 갱신을 지원하려면 필요한 변경입니다.
@ailrunAilrun (UTC-5/-4) 말씀하신대로 저 변경사항이 오류랑 관련이 없는거 같아 아리송한 와중에, 저게 9.4 -> 9.6의 컴파일러 변경 사항이 저거밖에 없어서 오리무중에 빠졌네요. 빨리 재현 코드를 만들어봐야겠습니다.
@bglbgl gwyng 양상자와 더 관련있어보이는 변화는 Record 갱신 관련 변화일 것 같습니다. Type Family나 GADTs 관련 Record 갱신이 있는지 살펴보세요.
https://gitlab.haskell.org/ghc/ghc/-/wikis/migration/9.6#superclass-expansion-is-more-conservative
내가 9.4 -> 9.6 마이그레이션에서 겪고 있는 문제가 이거랑 관련이 있는거 같은데(확실치 않음)... 9.4에서는 c :: Type -> Constraint 일때 forall c. c Int 뭐 이런 조건이 있으면, 모든 c에 대해 c Int가 존재하는게 말이 안되는데도 실제로 c Int 꼴로 쓰이는 c만 고려해서 타입체크를 통과시켜줬던거 같다(이것도 확실하지 않음). 근데 9.6에선 당연히 거부당한다.
위의 내 이해가 맞다면 9.4의 constraint solving 완전 무근본이었단건데, 이건 또 믿기 어렵다(하스켈의 설계 결정에 대한 신뢰 유지한다고 하면). 어디서 내가 잘못 파악한거지.
@bglbgl gwyng 이 변화는 Paterson-smaller 제약들(Constraints), 즉 어떤 정렬 순서(Well-order)에 의해 더 작은 제약들만 확장하겠다는 확장 순서의 변화고, 이를 제외하면 양상자(quantifier)와의 상호작용은 크게 변하지 않았습니다. 따라서 설명하신 것과는 다른 방식으로 오류가 발생하게 되지 않았나 싶습니다.
adjoint도 두 개가 짝을 이뤄 뭔가를 완성하는 느낌이 있었는데, dual도 뭔가 시스템이 완성?안정?된 느낌도 들고 그러네요.
아직 콕 짚지는 못하지만, 프로그램 설계할 때, 기계적으로 따르기만 해도 도움이 될 것 같은 요소가 있을 것만 같아서, 가끔 이해하고 싶은 욕구가 생기는데, "화살표를 싹다 뒤집으면 듀얼"이야 같은 말로는 응용할 수 있을만한 이해에 도달을 못하고 있습니다.
인문학스런 해석 질문은 그만 드려야겠지요.
@ailrunAilrun (UTC-5/-4)
@lionhairdino 쌍대는 너무 일반적인 개념이라 쌍대 자체를 응용하기에는 구체성이 모자라고요, 어떤 것의 쌍대를 이용할 것인가를 살펴봐야지요. 이를테면 A의 쌍대를 A -> Void로 생각할 때에는 쌍대의 쌍대가 (A -> Void) -> Void, 즉 Continuation Passing Style에 해당하는 변환을 주지요.
아하!하고 답 달려고 고민했는데, 역시나 어렵네요. 둘이 서로 반쪽같은 것들로, 둘을 가지고 있으면 뭔가 되는 그런 "느낌"이라고 뿐이 감이 안오네요. 0에서 +1로 갔다가 -1로 오면 "역"이지만, 0에서 +1로 가고, 0에서 -1로 가는 건 듀얼로 볼 수 있겠지요? 똑 떨어지지 않는 인문학 같아요.
@ailrunAilrun (UTC-5/-4)
@lionhairdino 두 번 취해서 제자리로 돌아와야하니 +1을 -1로 보내고 -1을 +1로 보내는 것에 더 가깝지요
얼마 전에 LaTeX에 2020년에(;;) 추가된 NewDocumentCommand에 대해 알게됐는데, 왜 이제야 알았는지 억울할 지경이다.
진작부터 편하게 선택 인자의 순번이랑 선택인자 구분자(기본은 [와 ]인 것)를 바꿔가면서 썼다면 얼마나 좋았을까
거의 15년 전에 야심 넘치게 Benjamin C. Pierce의 Types and Programming Languages를 한 권 장만했지만 아직도 아주 깨끗하다. 앞으로도 읽을 일이 없을 것 같다… ㅋㅋㅋ
@hongminhee洪 民憙 (Hong Minhee) 재밌는 책입니다. 철학은 둘째치고 필력은 아주 좋으시죠.
듀얼은 일반인이 이해하게, 간단한 문장으로 똑 떨어지게 설명하기 어렵네요 (관련 전공자 아님)
@lionhairdino 그나마 나은 설명은 "쌍대란 쌍대의 쌍대가 자기 원래의 대상과 같은 무언가" 아닐까요.
@lionhairdino @domatdo도막도 다른 글에서 CBPV의 컴파일에 대해 다룬다면 이야기하겠지만 CBPV의 경우 jump와 연관된 건 thunk에 더 가깝습니다.
@lionhairdino @domatdo도막도 정확히는 thunk를 force할 때 thunk의 몸체로 jump한다고 볼 수 있습니다.
@lionhairdino @domatdo도막도 함수의 경우에는 그냥 완전히 다른 해석을 하고 있기 때문이라고 보시면 됩니다. 원래의 람다 함수를 기계 수준에서 이해하려고 한다면 함수 정의로 jump하는 개념을 항상 포함하고 있다고 볼 수 있습니다. 이와는 다르게 CBPV는 값과 계산을 나눔으로서 람다 함수를 그냥 빼내기 연산(Pop) 이후 다른 연산을 이어하는 것으로 바꾼 거지요.
@lionhairdino @domatdo도막도 다른 글에서 CBPV의 컴파일에 대해 다룬다면 이야기하겠지만 CBPV의 경우 jump와 연관된 건 thunk에 더 가깝습니다.
(비전공자가 볼 내용은 아닌 것 같긴 한데요.) 취미 공부하는 사람의 질문입니다.
"인자를 받는다"는 행위를
"인자를 스택에 넣는다" 와 "인자를 스택에서 빼낸다" 둘 로 쪼개어
보는 아이디어에서 시작하는 것으로 보면 되나요?
그래서 adjoint란 용어가 아른 거리는 건가 싶습니다.
람다식을, 인자가 아직 들어오지 않아 reduce할 게 없는 값으로 볼 때는
[1.인자를 스택에 push ---2.인자를 스택에서 pop] 이 없어 reduce할 게 없는 상태로 봤는데,
CBPN에선 [2.인자를 스택에서 pop]은 있고, 이 걸로 reduce할 게 있는 상태.
로 본다는 얘기인가요?
위 설명에서 질문하고 싶은 것도 한 가득이고, @domatdo도막도 님의 이어지는 질문도 어렵긴 한데, 뭔가 전부는 아니더라도 "제가 필요한 정도"의 것은 건져갈 게 보이는 것 같아 질문드립니다.
@ailrunAilrun (UTC-5/-4)
@lionhairdino @domatdo도막도 함수의 경우에는 그냥 완전히 다른 해석을 하고 있기 때문이라고 보시면 됩니다. 원래의 람다 함수를 기계 수준에서 이해하려고 한다면 함수 정의로 jump하는 개념을 항상 포함하고 있다고 볼 수 있습니다. 이와는 다르게 CBPV는 값과 계산을 나눔으로서 람다 함수를 그냥 빼내기 연산(Pop) 이후 다른 연산을 이어하는 것으로 바꾼 거지요.
@ailrunAilrun (UTC-5/-4) (force . thunk) m = m이라 볼 수 있지 않았나요?
@domatdo도막도 그 둘은 같습니다만
thunk에 congruence rule이 없습니다. 즉 M = L이어도 thunk(M) = thunk(L)인 것은 아닙니다. (M을 계산한 결과가 L인 경우, thunk(M)은 지연된 계산이기 때문에 더이상 평가가 진행되지 않아 thunk(L)이 될 수 없습니다.)
@ailrunAilrun (UTC-5/-4) 아, thunk . force라고 해야 했는데 force . thunk라 했네요..! 그리고 다시 생각하니 thunk . force도 항등 사상이 맞군요…
@domatdo도막도
thunk . force가 좀 난해한 녀석이죠. thunk를 LISP의 quasi quotation으로, force를 back quotation으로 이해하면 thunk . force는 항등입니다만, thunk를 그냥 지연된 계산으로 이해하면 thunk (M)은 지연된 M 계산이고 thunk (force (thunk (M)))은 지연된 force (thunk (M)) 계산이라 같다고 하기 미묘합니다. 이 맥락에서 같다는 두 프로그램이 실행되어서 문법적으로 동일한 결과 값을 준다는 이야기일 때요.
@domatdo도막도 그 둘이 사실 수반 함자(Adjoint Functor)의 구현입니다. 강한 형 CBPV를 사용하면
thunk(-)는 Up -의 생성자고 return은 Down -의 생성자인데요, 이 두 함자 Up과 Down이 수반 함자 쌍을 이룹니다.
@domatdo도막도 다른 말로는
Up (Down a)는 모나드(Monad)고 Down (Up a)는 코모나드(Comonad)가 되는데요, 이를 이용해 CBPV는 Effect 또한 자연스럽게 다룰 수 있습니다. 글에서 다루기에는 소개할 내용이 많아서 생략했지만요.
@ailrunAilrun (UTC-5/-4) 재밌게도 force . thunk랑 return . thunk 모두 항등 사상이 못 되네요. 이건 값이 ‘~인 것‘이기 때문일까요? ~인 것을 갖고 무언가를 더 하기 위해서 return과 to가 있는 것인가 싶어졌어요.
@domatdo도막도 그리고
force . thunk는 항등사상이 맞습니다. M은 M이라는 계산을 하는 녀석이고, force (thunk (M))도 정확히 M이라는 계산을 하는 녀석이죠.
@ailrunAilrun (UTC-5/-4) 재밌게도 force . thunk랑 return . thunk 모두 항등 사상이 못 되네요. 이건 값이 ‘~인 것‘이기 때문일까요? ~인 것을 갖고 무언가를 더 하기 위해서 return과 to가 있는 것인가 싶어졌어요.
@domatdo도막도 그 둘이 사실 수반 함자(Adjoint Functor)의 구현입니다. 강한 형 CBPV를 사용하면
thunk(-)는 Up -의 생성자고 return은 Down -의 생성자인데요, 이 두 함자 Up과 Down이 수반 함자 쌍을 이룹니다.
@ailrunAilrun (UTC-5/-4) 연구하고 계신 체계는 어떤 체계인가요?
@domatdo도막도 수반 논리(Adjoint Logic)에 기반한 언어간 상호운용성(interoperability)입니다. CBPV를 이 관점에서 이해하면 계산 언어와 값 언어간의 상호운용성을 특정한 방식으로 구현했다고 볼 수 있습니다. CBPV가 수반 논리보다는 제한적인 대신 그 제한이 기계 수준에서 이해하는데는 유용한 점이 있다고 비교해 볼 수 있겠네요.
@lionhairdino 이런 내용을 쓰고 있었는데 마침 함수 정의/적용/변수에 대한 말이 딱 나와서 기분이 묘했네요 ㅋㅋㅋ
@ailrunAilrun (UTC-5/-4) 람다 대수 스펙이 있다면 축약 방법은 Unspecified behavior라고 볼 수 있겠네요. 이곳저곳에서 Call-By-Push-Value를 자주 언급해서 궁금하던 찰나였는데 친절하게 설명해주신 덕분에 편하게 이해할 수 있었습니다. 늘 감사합니다.
@domatdo도막도 저 개인적으로는 CBPV랑 경쟁하는(?) 체계를 연구하고 있다보니 CBPV의 약진이 맘에는 안 듭니다만
Hackers' Pub의 문제는 아니고 Firefox랑 Linux 한글 입력기랑 JS기반 입력기의 환장의 콜라보같은데, 긴 글을 치다보면 한글 입력을 가끔 씹는다. 이를테면 "우주로 가자."고 치는데 "우주로 가." 같이 쳐지는 상황
Facebook에서 특히 자주 발생하는 문제지만 그렇다고 다른데에서 안 터지는 것도 아니라 참 답답
Hackers' Pub의 문제는 아니고 Firefox랑 Linux 한글 입력기랑 JS기반 입력기의 환장의 콜라보같은데, 긴 글을 치다보면 한글 입력을 가끔 씹는다. 이를테면 "우주로 가자."고 치는데 "우주로 가." 같이 쳐지는 상황
함수형을 공부하기 전, 함수 작업?의 대상을 {함수, 인자}로만 인식했었는데, {함수, 인자, 적용}으로 인식하기 시작하면서 편해지는 게 많아졌습니다. 그런데 이게 편한 이유가 다른 배경 지식이 생겨서 그런 건지, 이 길로 가는게 쉬운 길이어서 그런 건지는 잘 모르겠습니다. 여기서 시작하면 $와 <$>가 자연스러워 보였습니다. 혼자 결론에 도달하고는, 누군가가 처음 공부할 때 알려줬으면 좋았겠는데 싶었습니다. 그냥 혼자 생각입니다.
꾸벅 꾸벅 조는 건 완전 동의입니다. 제가 혼자 그 공부하면서 졸았습니다. @xtjuxtapose
@lionhairdino @xtjuxtapose 마침 방금 공개한 글이 이런 이해와 관련이 있어보이네요.
함수형 언어의 평가와 선택
Ailrun (UTC-5/-4) @ailrun@hackers.pub
이 글은 함수형 언어의 핵심 개념을 람다 대수를 통해 소개하며, 함수형 언어의 평가 방식에 대한 깊이 있는 이해를 제공합니다. 람다 대수의 기본 요소인 변수, 함수, 함수 호출을 설명하고, 값에 의한 호출(CBV)과 이름에 의한 호출(CBN)의 차이점을 명확히 분석합니다. 특히, 폴 블레인 레비의 "값 밀기에 의한 호출(CBPV)"을 소개하며, 이 방식이 CBV와 CBN을 모두 포괄할 수 있는 강력한 도구임을 강조합니다. CBPV가 함수와 함수 호출을 스택 기반으로 어떻게 다르게 해석하는지, 그리고 이를 통해 람다 대수를 기계 수준으로 컴파일할 때 얻을 수 있는 이점을 설명합니다. 항수 분석과 같은 최적화 기법을 CBPV를 통해 어떻게 더 명확하게 표현할 수 있는지 보여주며, GHC 컴파일러의 중간 언어로서 CBPV의 중요성을 부각합니다. 이 글은 함수형 언어의 깊은 이론적 배경과 실제 컴파일러 구현 사이의 연결고리를 탐구하고자 하는 독자에게 유용한 통찰력을 제공합니다.
Read more →
@curry박준규 더 primitive한 의미론을 포착해서 문법 요소로 만들고 그걸로 다양한 정의를 하게 하는게 낫다는 점에선 동의하는데요. 말씀하신 기준을 그대로 적용해버리면, 모든 언어들이(하스켈도 포함) 발전할수록 점점 키워드가 추가되는데, 그때마다 점점 더 안 좋아졌다고 하면 좀 이상하죠.
@bglbgl gwyng
@curry박준규 적은 키워드로 표현 가능한 상황이 더 많다면 "디자인(Design)이 더 잘 되었다"고는 할 수 있다고 봅니다. 언어가 발전한다는게 디자인을 개선한다는 것과 직결되어있지 않은 경우가 더 많으니 말입니다. (많은 경우 표현력의 증대나 자주 사용되는 표현의 단순화에 더 집중하죠)
@bglbgl gwyng 이게 생각해보니 ‘문법이 복잡하다’, ‘문법 요소가 적다’라는 표현이 구체적이지 않은 것 같습니다. 갑자기 언어 확장이 떠오르면서 ‘문법 안 복잡한 거 맞나?’ 싶네요. 그래서 표현을 좀 바꾸면 저는 사전에 정의된 키워드가 적을 수록 좋다고 생각합니다.
@curry박준규
@bglbgl gwyng 사실 문법의 복잡도로 따지면 Haskell 등보다 의존 형 언어(Agda나 Idris 등)가 더 단순한 경우가 많죠. 같은 표현식을 형과 항에 공유해서 쓰기 때문에
@lionhairdino :%!foo가 파일의 전체 내용을 foo의 출력으로 대체하는 방식이다 보니 그런 것 같습니다.
@curry박준규
@lionhairdino 종료 코드(Exit code)가 0이 아닐 때는 실패하는 방식이 없나요? Emacs는 그런 식으로 도니 Vim에도 있을법 한데...
@bglbgl gwyng
@kodingwarriorJaeyeol Lee
@lionhairdino
제 심상이랑은 좀 다르네요. 저는 H의 중간 막대가 좀 아래로, H가 좌우로 살짝 벌어져있고 P가 좀 더 바짝 붙은 형태를 상상했습니다. Inkscape 켜서 직접 그리기에는 졸리네요 😅
슬슬 해커스펍 svg 로고를 찾을 때가 오고 있습니다.
@lionhairdino 딱 떠오르는 건 HP를 붙여서 맥주잔 모양으로 만드는 거네요
책[1]에서 문자열을 다룰 때 StrictText와 Builder의 성능을 비교하는 예제에서 Builder의 성능이 더 좋다고 설명한다. 그런데 내 PC에서 같은 코드를 실행했는데 결과가 반대로 나왔다. 이상해서 문자열 길이를 늘렸더니 책에서 말한대로 나왔다.
ghci> concatSpeedTest 50000
0.004451s
0.04721s
ghci> concatSpeedTest 500000
0.062405s
0.023449s
ghci> concatSpeedTest 5000000
0.511402s
0.205632s
Chris Martin, Julie Moronuki, 《Sockets and Pipes》 ↩︎
@curry박준규 짧을 때는 길이가 chunk size의 배수냐가 중요할 겁니다. 길 때는 평균적인 성능이 나오겠지만요.
Yacc와 같은 파서 제네레이터에 BNF를 넣으면 파서 코드가 자동으로 생성된다. 그런데 HTTP나 ActivityPub 등의 프로토콜 스펙을 입력으로 넣으면 자동으로 코드를 구현해주는 도구 어디 없나?
@curry박준규 구문론(Grammar theory)에 대한 이해도와 규약론(Protocol theory)에 대한 이해도가 차원이 달라서... 구문론 수준의 도구를 만들기는 어렵죠.
CBPV가 핫하다보니 다뤄야 할 것이 가지치기로 막 늘어난다. 어떻게하면 핵심만 다룰 수 있을까...
아이폰 사파리 가로 스크롤 원인
@lionhairdino 지금 보니까 Graphviz 이미지도 그렇네요. 이미지가 모두 그런 걸까요 아니면 Graphviz만 그런 걸까요
아이폰 사파리 가로 스크롤 원인
@lionhairdino 다른 브라우저에서도 몇몇 긴 이름들이 가로로 스크롤을 하게 만들더라고요
@ailrunAilrun (UTC-5/-4) 맞아요. 사실 저는 줄바꿈 문자라고 부르는 것보다 줄끝 문자라고 불러야 하지 않나 싶습니다.
@hongminhee洪 民憙 (Hong Minhee) 말씀대로 "줄끝 문자" 혹은 "줄마침 문자"가 더 직관적인 이름일 수도 있겠습니다.
협업을 할 때 미묘하게 거슬리는 것들
- 텍스트 파일의 마지막 줄 완성 안 하기 Posix 표준 기준으로 각 줄은 새줄 문자(line feed, '\n')로 끝나야 하며, 마지막 줄도 예외는 아님
- 그리고 위의 일이 주기적으로 재발할 때
다음 글은 CBPV에 대해서 써볼까 합니다. CBV(Call-By-Value)나 CBN(Call-By-Name)은 전공자라면 한번쯤은 들어봤을 이름이지만, CBPV는 특정 분야 석박사가 아니면 들어본 적 없을 것 같네요. 하지만 실제 컴파일러 구현(GHC지만...)도 논의되고 있는 만큼 앞으로 유명해지지 않을까 싶어 미리 다뤄보려고 합니다.
어이쿠, CBPV가 무엇의 약자인지 써놓지를 않았네요. Call-By-Push-Value의 약자입니다. "Push"가 들어가는 걸로 CBV랑은 완전히 다른 것이 되는데요, 어찌 다른지는 글에서 다뤄보도록 하겠습니다.
다음 글은 CBPV에 대해서 써볼까 합니다. CBV(Call-By-Value)나 CBN(Call-By-Name)은 전공자라면 한번쯤은 들어봤을 이름이지만, CBPV는 특정 분야 석박사가 아니면 들어본 적 없을 것 같네요. 하지만 실제 컴파일러 구현(GHC지만...)도 논의되고 있는 만큼 앞으로 유명해지지 않을까 싶어 미리 다뤄보려고 합니다.
@lionhairdino SKI도 잘 안쓰이는데 그보다 심한 Jot은 안 쓰이지 않을까요
@ailrunAilrun (UTC-5/-4) 아, 단.무.지!로 잘 해결하는 사람 못이깁니다. ㅋㅋ
@lionhairdino "잘"인지는 모르겠습니다만 다른 것도 크게 도움은 안 되더라구요 ;;


