아마도 레코드를 찾고 있습니까?
(require '[clojure.set :as cset])
(defrecord Person [name age address phone email])
;; Make a keyword-based constructor to verify
;; args and decouple ordering.
(let [valid #{:name :age :address :phone :email}]
(defn mk-person[& args]
(let [h (apply hash-map args)
invalid (cset/difference (set (keys h)) valid)]
(when-not (empty? invalid)
(throw (IllegalArgumentException. (pr-str invalid))))
; any other argument validation you want here
(Person.
(:name h) (:age h) (:address h) (:phone h) (:email h)))))
=> (def p (mk-person :name "John" :email "[email protected]"))
#:user.Person{:name "John", :age nil, :address nil, :phone nil,
:email "[email protected]"}
이제 기능 (예외) 또는 키워드 (안 예외)로 데이터에 액세스하여 사용자가 잘못 입력 한 이름에 대한 예외를할지 여부를 선택할 수 있습니다.
=> (.fax p)
java.lang.IllegalArgumentException:
No matching field found: fax for class user.Person
=> (:fax p)
nil
이 방법을 사용하면 기존 방법과 충돌하는 필드 이름을 피할 수 있습니다. (@Jouni에서 주석을 참조하십시오.) 또한
, 당신은 조회에 대한 키워드 유효하지 않은 키를 확인 접근 기능을 사용하여 필드 이름 제한을 우회 할 수있다 :
(defn get-value [k rec]
(let [v (k rec ::not-found)]
(if (= v ::not-found)
(throw (IllegalArgumentException. (pr-str k)))
v)))
=> (get-value :name p)
"John"
=> (get-value :fax p)
IllegalArgumentException: :fax
을 "잘못을 Destructuring 목록의 일부 "유형 문제는 목록에서"사람 "과 같은 것을 인코딩하려고 시도했을 때 올 수 있습니다. "우편 번호는 '사람 목록'의 3 번 위치에있는 '주소'목록의 네 번째 요소와 같은 것을 기억해야합니다.
'고전'리스프에서 당신이 접근 자 함수를 작성하여, Clojure에 당신이 기록을 사용할 수있는 해결 있습니다.
Typos는 프로그래밍 언어에서 문제를 일으킬 수 있습니다. 가능한 한 빨리 그 (것)들을 붙잡는 것을 시도하십시오.
자동 완성 기능이있는 Java IDE는 사용자가 입력하는 동안 오타가 발생할 수 있으며 정적으로 입력 된 언어는 컴파일 할 때 많은 오류를 잡아 내지 만 동적 언어에서는 런타임까지 찾을 수 없습니다. 어떤 사람들은 이것을 파이썬, 루비 등을 포함한 동적 언어의 단점이라고 생각하지만, 프로그래머들은 상당수의 프로그래머들이 IDE 자동 완성 및 컴파일 시간 오류의 손실보다 더 많은 이득을 얻고 코드를 저장하는 것이 더 중요하다고 생각합니다.
원리는 두 경우 모두에서 동일 : 이전 예외는 더 나은, 원인을 찾을 통해 웨이드 적은 코드가 있기 때문에. 이상적으로 스택 트레이스는 오타로 곧바로 이끌 것입니다. Clojure에서 레코드 및 접근 자 함수를 사용하면 이러한 이점을 얻을 수 있습니다.
이 글이 게시 된 이후 core.typed가 출시되었으며 http://typedclojure.org/와 동일한 작업을 수행 할 수도 있습니다. – Ben