개발) 저는 요즘 틈틈이 clojure를 공부하고 있습니다
알림
|
페이지 정보
작성일
2024.12.30 20:25
본문
일부러 업무에 상관없는 놈을 살펴보자 해서 Lisp 방언들 중에 찾아보다가 JVM 위에서 돌아가는 Clojure를 골라보았습니다
Lisp은 소싯적에 MIT Scheme이나 Emacs Lisp 살짝 다뤄본게 다였지만 그래도 아무튼 다같은 Lisp이라 적응하는데 도움이 되었습니다
core.async나 core.logic 같은 것도 재미지고 무엇보다 강력한 매크로 기능 탐구하느라 시간 훌쩍 가네요
다만 마이너한 언어다보니 주변에 의견 나누며 공부할 사람이 적어서 아쉽습니다
한국 클로저 사용자 모임 밋업이 종종 열리는것 같은데 그런데 나가볼 레벨은 아직 아닌거 같고
내년에 좀 기웃거려봐야겠습니다
현재는 유튜브, 특히 언어 창시자인 리치 히키 아재 영상 참조 많이 하고 있네요
댓글 13
/ 1 페이지
massei85님의 댓글의 댓글
@아스파라거스님에게 답글
같은 기능이더라도 최대한 멋드러지게(?) 조합하는 재미가 쏠쏠합니다 ㅋㅋ
massei85님의 댓글의 댓글
@사자바람연꽃님에게 답글
이놈은 괄호 지옥 때문에 물리적으로도(?) 복붙이 힘들더군요 ㅋㅋ
트라팔가야님의 댓글
프로그래밍이 간단히 되는 건가ㅜ보네요
(ns dijkstra-example.core
(:require [clojure.set :as set]))
(defn dijkstra [graph start]
(let [vertices (keys graph)
;; Initialize distances map, start with 0 for `start` and infinity for others
distances (reduce (fn [dist v]
(assoc dist v (if (= v start) 0 Double/POSITIVE_INFINITY)))
{}
vertices)
;; Initialize the previous map for tracking the shortest path
previous {}
;; Set of unvisited nodes
unvisited (set vertices)]
(loop [distances distances
previous previous
unvisited unvisited]
(if (empty? unvisited)
{:distances distances :previous previous}
(let [;; Get the vertex with the smallest distance in the unvisited set
current (apply min-key distances (filter unvisited (keys distances)))
;; Get all neighbors of the current node
neighbors (graph current)]
;; Update distances for each neighbor
(let [distances (reduce (fn [dists [neighbor weight]]
(let [alt (+ (distances current) weight)]
(if (< alt (distances neighbor))
(assoc dists neighbor alt)
dists)))
distances
neighbors)
;; Update the previous node for each neighbor
previous (reduce (fn [prev [neighbor weight]]
(let [alt (+ (distances current) weight)]
(if (< alt (distances neighbor))
(assoc prev neighbor current)
prev)))
previous
neighbors)]
;; Mark the current node as visited
(recur distances previous (disj unvisited current))))))))
;; Example graph
(def graph
{:A [[:B 1] [:C 4]]
:B [[:C 2] [:D 6]]
:C [[:D 3]]
:D []})
;; Example usage
(def result (dijkstra graph :A))
(println "Distances:" (:distances result))
(println "Previous:" (:previous result))
(ns dijkstra-example.core
(:require [clojure.set :as set]))
(defn dijkstra [graph start]
(let [vertices (keys graph)
;; Initialize distances map, start with 0 for `start` and infinity for others
distances (reduce (fn [dist v]
(assoc dist v (if (= v start) 0 Double/POSITIVE_INFINITY)))
{}
vertices)
;; Initialize the previous map for tracking the shortest path
previous {}
;; Set of unvisited nodes
unvisited (set vertices)]
(loop [distances distances
previous previous
unvisited unvisited]
(if (empty? unvisited)
{:distances distances :previous previous}
(let [;; Get the vertex with the smallest distance in the unvisited set
current (apply min-key distances (filter unvisited (keys distances)))
;; Get all neighbors of the current node
neighbors (graph current)]
;; Update distances for each neighbor
(let [distances (reduce (fn [dists [neighbor weight]]
(let [alt (+ (distances current) weight)]
(if (< alt (distances neighbor))
(assoc dists neighbor alt)
dists)))
distances
neighbors)
;; Update the previous node for each neighbor
previous (reduce (fn [prev [neighbor weight]]
(let [alt (+ (distances current) weight)]
(if (< alt (distances neighbor))
(assoc prev neighbor current)
prev)))
previous
neighbors)]
;; Mark the current node as visited
(recur distances previous (disj unvisited current))))))))
;; Example graph
(def graph
{:A [[:B 1] [:C 4]]
:B [[:C 2] [:D 6]]
:C [[:D 3]]
:D []})
;; Example usage
(def result (dijkstra graph :A))
(println "Distances:" (:distances result))
(println "Previous:" (:previous result))
massei85님의 댓글의 댓글
@트라팔가야님에게 답글
아 저도 입문 며칠 후에 바로 다익스트라랑 A*부터 해봤었는데 반갑네요 ㅋㅋㅋ
김재귀님의 댓글
재미있고 알흠다운 괄호월드.. 스킴은 마법사책 보셨나본데 그럼 엥간한건 다 아시는구먼요
클로저리안 slack서버에 #clojure-korea 채널 오셔서 모르시는거 물어보시면 좋아하실?겁니다 ㅎㅎ
클로저리안 slack서버에 #clojure-korea 채널 오셔서 모르시는거 물어보시면 좋아하실?겁니다 ㅎㅎ
massei85님의 댓글의 댓글
@김재귀님에게 답글
리습 입문자의 상당수가 sicp 때문에 입문한 경우가 많을거라 생각합니다 ㅋㅋ 그나저나 재귀가 포함된 닉에서 매우 신뢰가 가는군요 ㄷㄷ ㅋㅋ
massei85님의 댓글의 댓글
@농약벌컥벌컥님에게 답글
마이너 중 메이저 느낌입니다 ㅋㅋ 제 주위에서는 하스켈 파는 분이 클로저도 꽤 쓰셨더군요 어둠의 함수단 ㄷㄷ
plaintext님의 댓글
댓글보고 clojure 를 closure 하고 싶어지네요 ㅋㅋ
괄호천국이네요 ㅎㅎ
괄호천국이네요 ㅎㅎ
massei85님의 댓글의 댓글
@plaintext님에게 답글
그래도 레인보우 키고 코드 분리 열심히 하면 볼만한 것 같아요 ㅎㅎ
plaintext님의 댓글의 댓글
@massei85님에게 답글
하긴 그러면 은근 근사할거 같습니다 ㅎㅎㅎ
아스파라거스님의 댓글