클로저 연습문제
"Hello World"를 출력하는 프로그램을 파일로 작성하고 실행해 보시오.
"Hello World"를 출력하는 프로그램을 Leiningen 프로젝트로 만들어서
lein run
으로 실행해 보시오.- 힌트 : project.clj에
:main
키워드로-main
함수가 있는 네임스페이스를 지정해주면lein run
으로 편리하게-main
함수를 실행 할 수 있습니다.(defproject main-sample "0.1.0-SNAPSHOT" :description "FIXME: write description" :url "http://example.com/FIXME" :license {:name "Eclipse Public License" :url "http://www.eclipse.org/legal/epl-v10.html"} :dependencies [[org.clojure/clojure "1.7.0"]] :main main-sample.core)
- 힌트 : project.clj에
2번에서 작성한 프로젝트를
lein
으로 패키징해서java
로 실행해 보시오.힌트 :
-main
함수가 있는 (엔트리 포인트) 네임스페이스는(:gen-class)
를 줘서 시작 클래스를
생성해 줘야 합니다.(ns main-sample.core (:gen-class)) (defn -main [& args] (println args))
이름을 입력 받아 "Hello 이름"을 출력하는 프로그램을 작성하시오.
힌트 :
lein run
으로 실행하는 함수는 가변 인자로 커맨드 라인 인자를 받을 수 있습니다.(defn -main [& args] (println args)) $ lein run nil $ lein run 1 2 (1 2)
두 숫자를 입력 받아 합을 출력하는 프로그램을 작성하시오. (Leiningen 프로젝트 +
lein run
으로 실행)- 힌트 : 문자열을 숫자로 변한하기 위해서
Long/parseLong
함수를 사용합니다.user=> (Long/parseLong "13") 13
- 힌트 : 문자열을 숫자로 변한하기 위해서
사칙 연산 문자열(
+
,-
,*
,/
)과 두 수를 입력 받아 해당 연산을 출력하는 프로그램을 작성하시오.여러개의 숫자를 입력 받아 해당 숫자를 모두 더하는 프로그램을 작성하시오.
- 힌트 : 가변 인자 함수를 벡터 인자로 실행할 수 있는
apply
함수가 있습니다.user=> (str "hello" " " "world") "hello world" user=> (apply str ["hello" " " "world"]) "hello world"
- 힌트 : 가변 인자 함수를 벡터 인자로 실행할 수 있는
아래와 같은 파일을 만들어
config.edn
으로 저장하고config.edn
안에 있는:name
을 출력하는
프로그램을 작성하시오.{:name "clojure" :author "Rich Hickey"}
- 힌트1 : 파일을 읽어 문자열로 리턴해주는
slurp
함수가 있습니다.user=> (slurp "config.txt") test
- 힌트2 : edn 형식의 문자열을 읽어 클로저 맵으로 리턴해주는
read-string
이라는 함수가 있습니다.user=> (read-string "{:name \"eunmin\"}") {:name "eunmin"} user=> (class (read-string "{:name \"eunmin\"}")) clojure.lang.PersistentArrayMap
- 힌트1 : 파일을 읽어 문자열로 리턴해주는
id
(숫자),name
(문자열),age
(숫자),role
(키워드, 종류는:developer
,:manager
,:designer
,:tester
)을
데이터로 하는 사용자 데이터라고 하는 맵으로 만들어 출력하시오.9에서 만든 사용자 데이터를 여러개 가질 수 있는
users
라는 백터를 만들어 사용자 여러명을 넣어 데이터를 만들어 출력하시오.10에서 만든
users
벡터에서 개발자의 나이를 합산하는sum-developer-age
함수를 만들어보시오.10에서 만든
users
벡터에 마지막에 사용자를 추가하는add-user
라는 함수를 만들어 보시오.10에서 만든 users 벡터에 특정 id 사용자를 삭제하는
remove-user
라는 함수를 만들어 보시오.map
함수를 작성하시오.reduce
함수를 작성하시오.filter
함수를 작성하시오.example.util.string
네임스페이스에 특정 문자의 위치를 찾는index-of
함수를 만들고example.core
`-main
함수에서 "Hello World"에서 공백 문자를 찾는 예제를 작성하라.Jedis 자바 라이브러리를 이용해 Redis에서 get/set 하는 클라이언트 프로그램을 작성하시오. (조건 클라이언트 함수들은 별도의 네임스페이스에 작성하시오.)
- 힌트 : 자바 라이브러리를 사용하기 위해
project.clj
에:dependencies
키에[redis.clients/jedis "2.8.0"]
를 추가해준다. - 힌트 : Jedis 사용법은 https://github.com/xetorthio/jedis 를 참조
- 힌트 :
lein run set 키 값
또는lein run get 키
로 사용할 수 있도록 만든다.
- 힌트 : 자바 라이브러리를 사용하기 위해
쓰레드를 생성해서 바인딩하는
defthread
매크로를 작성하라.defthread
는 다음과 같이 사용한다.(defthread t1 (println (.getName (Thread/currentThread)))) (.start t1) ;; => Thread-0
atom
을 이용해서memo
함수를 구현하시오. 사용법은 아래와 같다.(def memo-inc (memo inc)) (memo-inc 1) ;; => 2
- 힌트 :
swap!
함수는(swap! players conj :player1)
처럼 함수와 첫번째 인자를 제외한 인자를 받을 수 있다. - 힌트 : 캐시 자료는 함수별로 클로저(closure)로 가지고 있으면 좋다.
- 힌트 : 맵의 키는 벡터를 사용할 수 있다.
- 힌트 :
문자열은 "문자열"(쌍따옴표 포함)로 바꿔주고
nil
은null
로 바꿔주고 그외의 값들은(str 값)
으로 바꿔주는convert
함수를
멀티메서드로 작성하라.- 힌트 : 값의 타입을 조회할때는
class
함수를 사용한다.
- 힌트 : 값의 타입을 조회할때는
:id
,:first-name
,:last-name
을 가지는User
레코드를 만들고:first-name
과:last-name
을 공백 기준으로 합쳐 리턴하는fullname
프로토콜과:id
,:first-name
,:last-name
을 보기 좋게 출력하는print
프로토콜을 정의하고 구현하라.