오이카페에 ActivityPub 지원이 들어갔습니다. 이제 좋아하는 작가나 커뮤니티의 새 그림을 연합우주에서도 받아 보세요!
작가 프로필이나 커뮤니티 메인 페이지에서 ActivityPub 핸들을 확인할 수 있습니다.
인용된 그림은 ActivityPub 연동을 도와주신 @hongminhee洪 民憙 (Hong Minhee) 님이 오이카페 초창기에 그려 주신 고양이 그림입니다. 감사합니다!
@jjme@hackers.pub · 40 following · 29 followers
약력은 비워둘 수 없습니다.
오이카페에 ActivityPub 지원이 들어갔습니다. 이제 좋아하는 작가나 커뮤니티의 새 그림을 연합우주에서도 받아 보세요!
작가 프로필이나 커뮤니티 메인 페이지에서 ActivityPub 핸들을 확인할 수 있습니다.
인용된 그림은 ActivityPub 연동을 도와주신 @hongminhee洪 民憙 (Hong Minhee) 님이 오이카페 초창기에 그려 주신 고양이 그림입니다. 감사합니다!
한국어로 쓰다가 '―' 문자를 넣는 순간 해커즈펍 자동 언어 인식 기능이 이 포스트를 러시아어로 인식하는 것을 발견(신세벌식 P2 배열을 통해 입력한 줄표)
RSS 피드….
CV 겸 개인 홈페이지였던 사이트를 아예 커스텀 블로그로 바꾸면서... 어제 슬쩍 홍보를 올렸는데요
Pelican으로 만들고 GitHub Pages로 배포를 했는데, 급하게 수정할게 있어서 추가 commit을 했더니 갑자기 README를 기반으로 한 디폴트 페이지로 바뀌었습니다;;;
그러니까 기존 배포 A, 리뉴얼 배포 B, hot-fix 배포 C 이렇게 세개가 있으면, C를 했는데 실패해서 (실패 원인: GitHub Action이 새벽에 일시적으로 불안정했음) 당연히 B가 나올줄 알았는데, A도 B도 아닌 README 기반의 만든적도 없는 배포 X가 나왔습니다... 왜였을까요...? Action 사용하기 이전 시절의 (Jekyll 등을 지원하던) GitHub Pages 빌드 방식이 남아있어서 뭔가 꼬였는지...
암튼 블로그 많이 놀러와주세요,,, 게임 추천으로 시작합니다 (포스트도 아니고 인덱스 페이지에서)
Codex한테 일 시키니까 lint가 조금 다르게 작동한다. 이거 어떻게 맞추더라….
핵커스펍이 있으면 퍽커스햅도 있어야 한다는 생각을 떨쳐내기가 어렵다. 기계적 균형이라는 건 언제나 어떤 종류의 파탄을 낳는다.
내가 기술 포스팅을 하지는 않지만, 할 수 있다면 코드조각이 오른쪽 정렬되어 있는 포스트를 작성해 보고 싶다. 인터넷을 찾아보면 어딘가에 여전히 있을 "가운데 정렬된 코드" 포스트의 미학을… 내 나름대로 계승하고 발전하고 싶은 심정이다.
논문요약기 리팩토링을 좀 했습니다 https://github.com/theeluwin/summarxiv 오픈소스지만 세팅하기 귀찮으신 분들을 위해서 제가 연1만원에 매일 아침 메일로 보내드립니다 https://forms.gle/xiLPNyEqsLEH5BLH9 많관부
Hackers' Pub의 로고 디자인이 완료되었습니다! 디자인은 박은지 님(@murinono무리노노)께서 해주셨습니다.
연합우주라는 콘셉트에 맞게 고양이의 입 주변을 별 모양으로, 목 아래에도 고리(orbital ring) 모양으로 디자인했습니다. 고양이를 고른 이유는 소프트웨어 프로그래머 커뮤니티에서 다른 동물보다 유독 고양이가 사랑 받기 때문이기도 하고, 고양이가 호기심이 강하기 때문이기도 합니다.
로고 디자인은 CC-BY-SA 4.0 라이선스로 배포됩니다.
GPT와 함께하는 게임 프로토타이핑 기록 "코딩 못하는 기획자"의 입장에서 진행해본, LLM을 활용해 게임 프로토타이핑을 만드는 경험에 대한 포스팅이 있어 공유드립니다.
@jjme정진명 안드로이드라면 소리 설정에서 다이얼패드 톤을 켤 수 있기는 합니다. 다만 도레미파 음계는 아니에요
@jarm정아름 전화기를 쥐고 멜로디를 연주할 수 있는 경험을 다시 하고 싶은 거라, 아쉽지만 다이얼패드 톤만으로는 해소되지 않는 점이 있습니다. 알려주셔서 감사합니다!
@saschanazKAGAMI🏳️🌈🏳️⚧️ 알려주셔서 감사합니다! 그런데 이건 정말 기술적으로 요구되었던(ㅋㅋ) 키음이라서 딱 제가 원하는 형태는 아니긴 하네요.
전화기 앱 개발을 별로 하고 싶지는 않은데, 딱 하나 있었으면 하는 앱이 있다. 다른 기능 없이, 그냥 123456789*0# 버튼 있고, 누를 때마다 도레미파솔라시도레미파솔 키음이 나는 기능이 있는 앱이 있었으면 좋겠다. 좀 더 욕심을 내자면, 버튼이 한 두 개 정도 더 있어서 파샵이랑 시플랫정도는 있었으면 좋겠다. 이게 없는 전화기는 내게 완전한 전화기가 아니다. 아쉽게도, 첫 스마트폰으로 아이폰4를 산 이후로 나는 완전한 전화기를 겪어보지 못했다.
회사에 "맥을 버릴 때는 어디에 담아서 버려야 할까요?"라는 질문과 답변을 유행시켰고 나는 기분이 좋다.
블로그 유입 만들어내기 어렵다. html title이 너무 짧으면 검색에 문제가 있을 수 있는 것 같아 포스팅 이름이 짧아도 블로그 이름과 이어서 표시하게 만들었다. 어렵다.
블로그 게시물들을 google 검색이 색인 안 해주고 있어서 슬퍼하던 도중 bing에서는 그래도 꽤 많은 페이지가 등록되어 있는 걸 발견
안녕하세요, 업으로 프로그래밍을 하고 있는 컴퓨터 학부생 김무훈입니다.
현재 3년차 웹 프론트엔드 개발자로서, 다가오는 7월부터 함께할 정규직 포지션을 적극적으로 찾고 있습니다.
최근 학과 사무실에서 졸업 요건을 확인한 결과, 전공 필수 한 과목과 전공 선택 2학점(총 5학점)이 남아있음을 확인했습니다.
본래는 다음 2학기까지 수료 후 내년 2월에 졸업할 예정이었으나, 교수진과 상의한 결과 취업 및 재직이 확정된다면 수업 이수 방식을 보다 유연하게 결정할 수 있다는 긍정적인 답변을 받아 적극적으로 조기 취업을 추진하게 되었습니다.
이는 전공 필수 과목의 경우에만 해당이 되는 문제이고, 전공 선택 2학점의 경우 앞으로의 여름 학기 현장 실습 또는 다음 학기에 개설되는 하나의 원격 강의로 대체하여 문제가 없는 상태입니다.
지금까지의 업무 경험과 프로젝트는 아래의 포트폴리오에서 확인하실 수 있습니다.
📌 경력기술서 겸 포트폴리오 페이지: https://www.frontend.moe/portfolio/
좋은 인연을 찾을 수 있도록, 많은 관심과 연락 부탁드립니다!
새로 읽으시는 분은 https://www.frontend.moe/resume/ 이쪽 이력서를 확인 부탁드립니다.
본문 내 아웃링크로 걸어둔 경력기술서 겸 포트폴리오 정보량이 너무 많다는 의견을 자주 받아서, 약식화한 RESUME 페이지를 새로 만들었습니다.
제주어 ISO 639 코드가 ko-jje에서 jje로 독립했구나.
다시 말해, 한국어 방언으로 간주됐다가 별개 언어로 독립했다, 이 말입니다.
https://iso639-3.sil.org/code/jje
리액트 작업하면 vs code 탭 두 개 한 화면에 브라우저 한 화면에 디자인 전달받아서 하면 figma나 시안 확인용 화면 하나에 모니터 세 개쯤은 있어야 하던데 노트북만 들고 카페에서 코딩하는 건 어떤 종류의 작업일까….
회사에서 엘릭서 책을 보는 사람을 발견했다….
이웃집에 자녀가 둘이 있다는 건 알고 있었는데, 오늘 아침 아내가 그 집 아들을 만나 인사했다고 한다. 그 얘기를 듣고 그럼 다른 아이는 딸일 확률이 높겠네 라고 말했더니 아내는 별 말 없이 고개를 끄덕였다. 이 때 내 아내가 이과 전공자일 확률은?
안녕하세요, 페미위키 개발팀입니다. 개발팀 활성화를 위해 이리저리 둘러보다 해커스펍에 대해 알게 되었습니다. 여건이 되면 페미위키 개발에 대해서 얘기할 수 있는 기회를 만들어보려 합니다!
더불어 페미위키 개발팀에서 오픈소스 컨트리뷰터 & 개발팀을 모집합니다! 페미니스트시라면 정체성 불문, 거주국 불문하고 모시고 있습니다. 함께 페미니즘 정보집합체 만들어가요!
적절한 타이밍
리디북스는 SEO 어떻게 하고 있을까… (구글에서 서명으로 검색했을 때 그다지 첫 페이지에 뜨는 것 같지 않음)
Hackers' Pub에 공유할 수 있는 초대 링크 기능을 추가했습니다. 설정 → 초대 페이지에서 초대 링크 생성이 가능하며, 초대 링크는 정원이나 유효 기간, 메시지를 정할 수 있게 되어 있습니다. 아무래도 DM으로 직접 초대 요청을 달라고 하면 쑥스러움이 많은 분들은 요청을 안 하시는 경우가 많은 것 같아서 만들게 되었습니다. 참고로, 초대 링크를 통해 가입한 사용자는 초대 링크를 생성한 사람과 자동으로 맞팔하게 됩니다.
최근에는 Replicube를 지나치게 많이 하고 있다. 얼마나 많이 했냐 하면 플레이어 커뮤니티에서 주최한 첫 온라인 이벤트에서 빌드 배틀에 나가서 2등 했다...
내가 뭐 쓴다고 발악할 수 있는 시간도 얼마 남지 않았을 수 있다. 그러니까 지금 써 두자.
"나는 예전에는 글을 많이 쓰곤 했다. 아이디어가 떠오르면 적어두고, 시간을 들여 신중히 다듬어서 하나의 작품으로 만든 다음, 완성되면 세상에 공유했다. (...) 하지만 이제는 아이디어가 떠올랐을 때 엉성한 단어 몇 개만 프롬프트에 밀어 넣으면 즉시 완성된 생각이 얻어진다. AI가 아이디어를 너무나 쉽게 구체화할 수 있기 때문에, 아무리 발전된 아이디어라도 내 생각을 공유하고 싶은 마음이 덜 든다." 요즘 내가 글을 안(못) 쓰는 이유와 일맥상통. https://dcurt.is/thinking
여전히 짧게나마 무언가를 읽고 쓰고 있다. 이게 내 기초체력이 되길.
혼자서 일하면 끔찍한 관리자 밑에서 일하는 경험과 끔찍한 프로그래머를 관리하는 경험을 동시에 할수 있다. 개꿀~
수학을 전공하긴 했지만, 논리와 집합 과목을 따로 듣지 않았는데 좀 아쉽다. 지금이라도 좀 찾아볼까.
범주론 다이어그램 테스트
게임쪽 개발자 컨퍼런스에서 생태계 관련 타일 상태 계산을 위해 병렬처리를 쓴 세션을 들은 적이 있는데, 이것저것 병렬처리를 하면서 배운 것에 대한 회고 세션이었지만 정작 마지막에 병렬이랑 무관하게 sparce matrix 구조 적용하니까 금방 끝났다는 내용이었어서 허탈했던 적이 있었다….
왜 이 이야기가 갑자기 생각났냐면, '연구자의 코드'를 1,000배 빠르게 고쳤다는 이야기를 보고 생각났기 때문이다. 우리 연구실 코드는 중요 전역 변수로 __, _ 써서 지켜보던 전산전공자를 경악하게 만든 코드지만, sparce matrix 구조는 적용했었다.
게임쪽 개발자 컨퍼런스에서 생태계 관련 타일 상태 계산을 위해 병렬처리를 쓴 세션을 들은 적이 있는데, 이것저것 병렬처리를 하면서 배운 것에 대한 회고 세션이었지만 정작 마지막에 병렬이랑 무관하게 sparce matrix 구조 적용하니까 금방 끝났다는 내용이었어서 허탈했던 적이 있었다….
정진명 shared the below article:
Ailrun (UTC-5/-4) @ailrun@hackers.pub
함수형 언어가 점점 많은 매체에 노출되고, 더 많은 언어들이 함수형 언어의 특징을 하나 둘 받아들이고 있다. 함수형 언어, 적어도 그 특징이 점점 대세가 되고 있다는 이야기이다. 하지만, 함수형 언어가 대체 무엇이란 말인가? 무엇인지도 모르는 것이 대세가 된다고 할 수는 없지 않은가?
함수형 언어란 아주 단순히 말해서 함수가 표현식[1]인 언어를 말한다. 다른 말로는 함수가 값이기 때문에 다른 함수를 호출해서 함수를 얻어내거나 함수의 인자로 함수를 넘길 수 있는 언어를 말한다. 그렇다면 이 단순화된 핵심만을 포함하는 언어로 함수형 언어의 핵심을 이해할 수 있지 않을까? 이게 바로 람다 대수(Lambda Calculus)의 역할이다.[2]
람다 대수는 딱 세 종류의 표현식만을 가지고 있다.
이후의 설명에서는 MM 과 NN, 그리고 LL이라는 이름을 임의의 표현식을 나타내기 위해 사용할 것이다. 람다 대수가 어떤 것들을 표현할 수 있는가? 앞에서 말했듯이 람다 대수는 함수의 인자와 함수 호출의 결과가 모두 함수인 표현식을 포함한다. 예를 들어 λx→(λy→y)\lambda x \to (\lambda y \to y) 는 매개변수 xx에 인자를 받아 함수 λy→y\lambda y \to y를 되돌려주는 함수이고, λx→(x (λy→y))\lambda x \to (x\ (\lambda y \to y))는 매개변수 xx에 함수인 인자를 받아 그 함수를 (λy→y\lambda y \to y를 인자로 사용하여) 호출하는 함수이다.
이제 문제는
그래서 람다 대수의 표현식이 하는 일이 뭔데?
이다. 위의 표현식에 대한 소개는 산수로 말하자면 x+yx + y와 같이 연산자(++)와 연산항(xx와 yy)로부터 얻어지는 문법만을 설명하고 있고, 3+53 + 5와 같은 구체적인 표현식을 계산해서 88이라는 결과 값을 내놓는 방식을 설명하고 있지 않다. 이런 표현식으로부터 값을 얻어내는 것을 언어의 "평가 절차"("Evaluation Procedure")라고 한다. 람다 대수의 평가 절차를 설명하는 것은 어렵지 않다. 적어도 표면적으로는 말이다.
이는 겉으로 보기에는 말이 되는 설명처럼 보인다. 하지만 이 설명을 실제로 해석기(Interpreter)로 구현하려고 시도한다면 이 설명이 사실 여러 세부사항을 무시하고 있다는 점을 깨닫게 될 것이다.
첫번째 문제는 비교적 간단히 해결할 수 있다. LL을 먼저 평가해서 λx→M\lambda x \to M 꼴의 결과 값을 얻어낸 뒤에 호출을 실행하면 되기 때문이다. 반면에 두번째 질문은 좀 더 미묘한 문제를 가지고 있다. 함수 호출의 평가에서 발생하는 이 문제에 구체적인 답을 하기 위해서는 값에 의한 호출(Call-By-Value, CBV)와 이름에 의한 호출(Call-By-Name, CBN)이 무엇인지 이해해야 한다.
앞에서 말한 함수 호출에서부터 발생하는 문제는 사실 함수형 언어에서만 발생하는 문제는 아니다. C와 같은 명령형 언어에서도 함수를 호출할 때 인자를 먼저 평가해야하는지를 결정해야하기 때문이다. 즉 이 문제는 함수를 가지고 있고 함수를 호출해야하는 모든 언어들이 가지고 있는 문제이다.
그렇다면 이 일반적인 문제를 어떻게 해결하는가? 대부분의 언어가 취하는 가장 대표적인 방식은 "값에 의한 호출"("Call-By-Value", "CBV")이라고 한다. 이 함수 호출 평가 절차에서는 함수의 몸체에 인자를 치환하기 전에[3] 인자를 먼저 평가한다. 이 방식을 사용하면 인자를 여러번 평가해야하는 상황을 피할 수 있다.
또 다른 방식은 "이름에 의한 호출"("Call-By-Name", "CBN")이라고 한다. 이 방식에서는 함수의 몸체에 인자를 우선 치환한 후 몸체를 평가한다. 몇몇 언어의 매크로(Macro)와 같은 기능이 이 방식을 사용한다. 얼핏 보기에는 CBN은 장점이 없어보인다. 그러나 함수가 인자를 사용하지 않을 경우는 CBN이 장점을 가진다는 것을 볼 수 있다. 극단적으로 평가가 종료되지 않는 표현식(Non-terminating expression)이 있다면[4] CBV는 종료하지 않고 CBN만이 종료하는 경우가 있음을 다음 예시를 통해 살펴보자. 표현식 (λx→(λy→y)) N(\lambda x \to (\lambda y \to y))\ N이 있다고 할 때, NN이 평가가 종료되지 않는 표현식이라고 하자. 이 경우 CBV를 따른다면 종료하지 않는 NN 평가를 먼저 수행하느라 이 표현식의 값을 얻어낼 수 없지만, CBN을 따른다면 λy→y\lambda y \to y라는 값을 손쉽게 얻어낼 수 있다. 바로 이런 상황 때문에
CBN은 CBV보다 일반적으로 더 많은 표현식들을 평가할 수 있다
고 말한다.
두 방식의 장점을 모두 가질 수는 없을까? 다시 말해서, 어떤 상황에서는 이름에 의한 호출을 사용하고, 어떤 상황에서는 값에 의한 호출을 사용할 수 없을까? 이 질문에 답한 수많은 선구자들 가운데 폴 블레인 레비(Paul Blain Levy)가 내놓은 답인 "값 밀기에 의한 호출"("Call-By-Push-Value", "CBPV")은 함수형 언어의 평가를 기계 수준(Machine level)에서 이해하는데에 있어 강력한 도구를 제공한다. CBPV는 우선 "계산"("Computation")과 "값"("Value")을 구분한다.
잠깐, 앞서서 함수형 언어에서 함수는 값이라고 하지 않았던가? 이는 값 밀기에 의한 호출에서 함수와 함수 호출을 종전과 전혀 다르게 이해하기 때문이다. 함수 λx→M\lambda x \to M는 스택(Stack)에서 값을 빼내어(Pop) xx라는 이름을 붙인 후 MM을 평가하는 것이고, 함수 호출 L VL\ V는 스택에 값 VV를 밀어넣고(Push)[5] LL을 평가하는 것이다. 따라서 함수 λx→M\lambda x \to M는 평가의 결과가 아닌 추가적인 평가가 가능한 표현식이 된다. 이 구분을 간결하게 설명하는 것이 다음의 CBPV 표어이다.
값은 "~인 것"이다. 계산은 "~하는 것"이다.
그렇지만 함수형 언어이기 위해서는 함수를 값으로 취급할 수 있어야 한다고 했지 않은가? 그렇다. 이를 위해 CBPV는
계산을 강제한다면(force\mathbf{force}) 계산 MM를 하는 지연된 계산인 값 thunk(M)\mathbf{thunk}(M)
을 추가로 제공한다. 이 둘 (force(V)\mathbf{force}(V)와 thunk(M)\mathbf{thunk}(M))을 다음과 같이 문법에 추가할 수 있다.
CBPV를 완성하기 위해 필요한 마지막 조각은 계산을 끝내는 법이다. 현재까지 설명한 λx→M\lambda x \to M와 L VL\ V 그리고 force(V)\mathbf{force}(V) 는 모두 다음 계산을 이어서 하는 표현식이고, 계산을 끝내는 방법을 제공하지는 않는다. 예를 들어 λx→M\lambda x \to M의 평가는 스택에서 값을 빼내고 계산 MM의 평가를 이어한다. 그렇다면 계산의 끝은 무엇인가? 결과 값을 제공하는 것이다. 이를 위해 return(V)\mathbf{return}(V)를 계산에 추가하고, 이 결과 값을 사용할 수 있도록 M to x→NM\ \mathbf{to}\ x \to N (계산 MM을 평가한 결과 값을 xx라고 할 때 계산 NN을 평가하는 계산) 또한 계산에 추가하면 다음의 완성된 CBPV를 얻는다.
이제 CBPV를 얻었으니 원래의 목표로 돌아가보자. 어떻게 CBV 호출과 CBN 호출을 CBPV로 설명할 수 있을까?
다소 설명이 복잡할 수 있으나, 단순하게 말해서 CBPV는 CBV에 따른 상세한 평가 순서와 CBN 따른 상세한 평가 순서를 세부적으로 설명할 수 있는 충분한 기능을 모두 갖추고 있으며, 이를 통해 CBV 함수 호출과 CBN 함수 호출을 모두 설명할 수 있다는 이야기이다.
앞에서는 CBPV가 CBV와 CBN를 모두 설명할 수 있음을 다뤘다. 그러나 CBPV는 프로그래머(Programmer)가 직접 사용하기에는 과도하게 자세한 세부사항들을 포함하고 있기에, 프로그래머가 직접 CBPV를 써서 CBV와 CBN의 구분을 조율하기에는 적합하지 않다. 그렇다면 어느 수준에서 CBV와 CBN을 혼합해 사용할 때 도움을 줄 수 있을까? 바로 람다 대수를 기계 수준으로 컴파일(Compile)할 때이다. 이때는 CBPV가 가진 자세한 세부사항의 표현력이 굉장히 유용해진다.
예를 들어 람다 대수를 기계 수준으로 변환할 때 흔히 필요한 것 중 하나인 항수 분석(Arity analysis)에 대해 이야기해보자. 항수 분석은 함수가 하나의 인자를 받은 뒤 실행되어야 하는지, 혹은 두 인자를 모두 받아 실행되어야 하는지 등을 확인하여 이후에 그에 걸맞는 최적화된 기계어(Machine language)를 생성할 수 있게 도와주는 분석 작업이다. 평범한 람다 대수에서는 항수 분석의 결과를 직접적으로 표현하기 어렵다. 예를 들어 람다 대수의 λx→(λy→y)\lambda x \to (\lambda y \to y)의 경우 이 함수가 xx와 yy를 모두 받아 yy를 되돌려주는 함수인지 (항수가 2인 함수인지), 혹은 xx를 받아 λy→y\lambda y \to y라는 함수를 되돌려주는 함수인지 (항수가 1인 함수인지) 구분할 수 없다. 그러나 이를 CBPV로 변환한 λx→(λy→return(y))\lambda x \to (\lambda y \to \mathtt{return}(y))나 λx→return(thunk(λy→return(y)))\lambda x \to \mathtt{return}(\mathtt{thunk}(\lambda y \to \mathtt{return}(y)))는 각각이 무엇을 뜻하는지 분명히 이해할 수 있다.
이런 장점을 바탕으로 CBPV를 더 발전시킨 "언박싱한 값에 의한 호출"("Call-By-Unboxed-Value")을 GHC 컴파일러의 중간 언어(Intermediate language)로 구현하는 것에 대한 논의가 현재 진행되고 있으며 앞으로 더 많은 함수형 컴파일러들이 관련된 중간 언어를 채용하기 시작할 것으로 보인다.
이 글에서는 함수형 언어의 핵인 람다 대수를 간단히 설명하고 람다 대수를 평가하는 방법에 대해서 다루어보았다. 특히 그 중 값 밀기에 의한 평가(Call-By-Push-Value, CBPV)가 무엇이며 CBPV가 다른 대표적인 두 방법(CBV, CBN)을 어떻게 표현할 수 있는지, 그리고 CBPV의 장점이 무엇인지에 대해서도 다루어 보았다. 이 글에서 미처 다루지 못한 중요한 주제는 CBPV를 기계에 가까운 언어로 번역해보는 것이다. 여기에서는 글이 너무 복잡해지는 것을 피하기 위해 제했으나, CBPV의 장점에서 살펴봤듯 이는 CBPV에 있어 핵심 주제 중 하나이기 때문에 이후에 다른 글을 통해서라도 이 주제를 소개할 기회를 가지고자 한다. 이 글이 CBPV에 대한 친절한 소개글이었기를 바라며 이만 줄이도록 하겠다.
결과 값(Value)을 가지는 언어 표현을 말한다.
예를 들어 1+11 + 1은 22라는 값을 가지는 표현식이지만
(JavaScript의) let x = 3;
나 (Python의)
def f(): ...
은 그 자체로는 값이 없기 때문에 표현식이
아니다. ↩︎
다만 실제 역사에서는 람다 대수의 이해와 발견이 함수형 언어의 개발보다 먼저 이루어졌다. 이런 역사적 관점에서는 (이미 많은 수학자들이 이해하고 있던) 람다 대수에 여러 기능을 추가한 것이 바로 함수형 언어라고 볼 수 있다. ↩︎
프로그래밍 언어(Programming Language)는 실제로는 치환을 사용하지 않고 환경(Environment)을 사용하는 경우가 더 많지만 설명의 편의를 위해 다른 언어들 또한 환경 대신 치환에 기반해 평가한다고 가정하겠다. ↩︎
앞서 설명한 람다 대수에서는 이를 쉽게 얻을 수 있다. 오메가(Ω\Omega)라고 부르는 표현식인 (λx→x x) (λx→x x)(\lambda x \to x\ x)\ (\lambda x \to x\ x)의 평가는 값에 의한 호출을 따르든 이름에 의한 호출을 따르든 종료되지 않는다. ↩︎
바로 이 함수 호출을 값 밀기에 기반해 해석하는 데에서 CBPV의 이름이 유래했다. ↩︎
feedly를 잘 쓰고 있지만 ghost pro의 activityPub 인터그레이션 사용 감각도 괜찮아서, 이걸 충분히 많은 블로그와 웹툰(xkcd도 rss feed를 발행한다) 등이 적용한다면, 연합우주를 좀 더 적극적으로 쓸 수도 있을 것 같다.
해커뉴스에서 Fabrice Bellard의 QuickJS가 한 파일에 5만줄 집어 넣고 한 함수가 몇백 몇천줄 되는 걸 보고서 파일 및 함수 길이를 강력하게 제한하는 도그마가 항상 옳은 것은 아니다, 라는 코멘트를 보았는데 이는 반만 맞는 말이다. 나도 대부분의 개발자보다 파일이나 함수 길이에 훨씬 관대한 (그리고 이 사실을 한참 뒤에야 깨달은) 사람이라 아는 건데, 그냥 Bellard가 5만줄 전체의 맥락을 전부 기억하고 있고 해당 코드를 거의 Bellard만 건들고 있기 때문에 추가적으로 모듈화할 필요가 없는 거고, 대부분은 그 정도의 기억이 불가능하기 때문에 여럿이 같이 짜는 코드라면 최저치에 맞춰서 파일이나 함수 길이를 줄일 필요가 있다고 하는 것이다. 지나친 도그마를 부정하는 것도 중요하지만 도그마가 생긴 진짜 이유를 파악해서 취사 선택하는 것이 더 중요한 이유.
@yurume유루메 Yurume (아무말) "A가 항상 옳은 것은 아니다"가 반만 맞으면 "A가 항상 옳은 것은 아니고, 절반 정도의 상황에서 옳다"가 되는 상상을 했습니다.
리디북스 결제 500 에러 뜬다…. 드디어 사람들이 책을 서버가 나갈 때까지 사는 시대가 되었구나
수학을 공부하다 보면 수많은 종류의 "같음"을 다루게 된다… 이 사고방식은 어딘가에 도움이 된다.
아니 이게 뭐야 ㅋㅋㅋㅋ JS 함수가 거기서 왜 나와 ㅋㅋㅋㅋ
2024년 16월 3일을 넘어 2025년 4월 4일로. 까 먹은 달이 많지만 할 일을 해 나가야지.
@hongminhee洪 民憙 (Hong Minhee) 제가 셸에 전반적으로 익숙하지 않아서 .bat을 만들어 작업할 바에는 .py를 만들어 쓰는 게 낫지 않나 생각했는데, 이걸 보니 은근히 파워셸로도 할 수 있는 일이 많을 것 같아서 흥미가 갑니다 ㅋㅋ
윈도에서 이미지 일괄 작업을 할 때 imagemagick을 최적의 소프트웨어라고 느낄 때가 있고, cli 소프트웨어가 윈도 11에서도 '현역'인게 신기하다.
개인적으로 웬만한 경우에는 prop drilling하는 걸(깊더라도) 선호하는데, 마우스를 따라다니고(=도큐먼트 기준 마우스 좌표를 알아야 하고) 해당 컴포넌트에 대한 설명을 담은(=해당 컴포넌트가 받은 prop을 쓰는) 마우스오버 툴팁을 여기저기에 붙여야 할 경우(=여러 번 구현해야 함) createContext/useContext를 쓰는 게 말이 되는 것 같았다.
접근성 문제 때문에 마우스오버로 정보를 보여주는 것 자체를 어디서나 쓸 수는 없겠지만… 다른 데 써 먹을 수도 있으리라 생각함.
정진명 shared the below article:
정진명의 굳이 써서 남기는 생각 @jm@guji.jjme.me
상호: キング軒 本通店
주소: 広島県広島市中区本通8-7 しげとみビル 1F
방문한 날짜: 2025년 3월 20일
먹은 메뉴: 즙 없는 탄탄멘(汁なし担担麺)
검은 면기에 가는 면이 담겨 있고 후추, 다진 고기, 채썬 대파가 올라가 있다.
즙 없는 탄탄멘이라는 것이 유행하다고 해서, 숙소 근처에 있는 가게에 가서 먹게 되었습니다.
가게에 들어가면 가게 전체에 나는 마라향(산초? 잘은 모르겠습니다.)에 압도됩니다. 조금 기다려서 서빙된 용기에서 면과 아주 적은 양의 국물을 잘 비벼 먹으면, 향에서 기대하게 되는 매운 맛은 강하지 않고, 강한 감칠맛이 올라옵니다. 매우리라는 기대를 배신당하는 점이 재미있고, 감칠맛이 좋습니다.
이 글을 쓰는 동안 맛과 향을 떠올리니 더 먹고 싶네요.