ν΄λ‘μ μμ μ μλ μκΈ° μμ μΌλ‘ νκ°λλ κ°(value)μ΄λ€. μ¦, μλμμ μ μ 17
μ
νκ°νλ©΄ κ·Έ κ²°κ³Όλ μκΈ° μμ μΈ 17
μ΄ λλ€.
17 ;=> 17
type
ν¨μλ₯Ό μ΄μ©νλ©΄, ν΄λΉ κ°μ΄ μ΄λ€ μλ£νμΌλ‘ ꡬνλμ΄ μλμ§λ₯Ό μ§μ νμΈν΄ λ³Ό μ μλ€.
(type 17) ;=> java.lang.Long
μμ κ²°κ³Όμμλ μ μ μλ―μ΄, ν΄λ‘μ μμ μ μνμ μλ°μ 'κΈ°λ³Έ(primitive) μλ£ν long'
νμ
μ λ΄λΆμ μΌλ‘ κ°μΈκ³ μλ wrapper classμΈ java.lang.Long
ν΄λμ€μ μΈμ€ν΄μ€μ΄λ€.
Caution
|
μλ°μ κΈ°λ³Έ(primitive) μλ£νμΈ long νμ΄ μλλΌ, λ νΌλ°μ€(reference) νμ
μΈ
java.lang.Long νμμ μ£Όμνμ. λ νΌλ°μ€ νμ
μ΄λ―λ‘ μ»¬λ μ
μλ£νμ μμλ‘
μ°μΌ μ μλ€.
|
Note
|
ν΄λ‘μ μμλ μ μ μ°μ°μ μλλ₯Ό λμ΄κΈ° μν λ°©λ²μΌλ‘, κΈ°λ³Έ μλ£νμΈ long νλ
λ€λ£° μ μλ λ°©λ²μ μ 곡νλ€. μ΄μ λν΄μλ
Numerics and
Mathematics μ₯μμ μμΈν λ€λ£¬λ€.
|
μ μ 맨μμ μ«μ 0
μ΄ μμΌλ©΄ 8μ§μλ₯Ό νμνκ³ , 0x
λλ 0X
κ° μμΌλ©΄ 16μ§μλ₯Ό
νμνλ€.
010 ;=> 8
0x10 ;=> 16
0X10 ;=> 16
ν΄λ‘μ λ 8μ§μμ 16μ§μ μ΄μΈμλ, 2μ§μμμ 36μ§μκΉμ§ νκΈ°ν μ μλ λ°©λ²μ μ 곡νλ€. r
λλ R
λ¬Έμ[1] μμ νννκ³ μ νλ μ§λ²μ
λνλ΄κ³ , κ·Έ λ€μ μ«μλ₯Ό νμνλ©΄ λλ€. μ€μ μ«μλ₯Ό νμν λ, 0
βββ9
λ₯Ό λμ΄κ°λ
μ«μλ μνλ²³ a
βββz
λλ A
βββZ
λ¬Έμλ₯Ό μ΄μ©νλ€.
Note
|
2 ~ 36μ§μκΉμ§μ ννμ java.lang.Long.parseLongμ μ΄μ©νλ€. |
;; 2μ§λ²
2r1111 ;=> 15
;; 3μ§λ²
3r11 ;=> 4
;; 8μ§λ²
8r11 ;=> 9
;; 16μ§λ²
16rFF ;=> 255
;; 36μ§λ²
36r1z ;=> 71
μ μμ 맨 λ€μ λλ¬Έμ N
[2]μ λΆμ΄λ©΄,
Long
νλ³΄λ€ ν° μμμ κΈΈμ΄μ μ μ(arbitrary-precision integer)λ ννν μ μλ€.
99999999999999999999N ;=> 99999999999999999999N
λ€μμ 2N
μ java.lang.Long
νμ΄ μλλΌ, clojure.lang.BigInt
νμ΄λ€.
2N ;=> 2N
(type 2N) ;=> clojure.lang.BigInt
Long
νλ³΄λ€ ν° μ μμ λͺ
μμ μΌλ‘ Nμ λΆμ΄μ§ μμλ, clojure.lang.BigInt
νμΌλ‘ μλ
νλ³νλλ€.
99999999999999999999 ;=> 99999999999999999999N
μλ μΉκ²© μ°μ°μ(+', -', *', inc', and dec')λ€μ Long κ³μ°μ΄ μ€λ²νλ‘μ°κ° λ°μνλ©΄ μλμΌλ‘ BigIntλ‘ λ³νν΄ μ€λ€.
(+ 1 Long/MAX_VALUE)
;>> java.lang.ArithmeticException: integer overflow
(+' 1 Long/MAX_VALUE)
;=> 9223372036854775808N
(class (+' 1 Long/MAX_VALUE))
;=> clojure.lang.BigInt
(class (+' 1))
;=> java.lang.Long
bigint
ν¨μλ BigIntλ₯Ό λ§λ λ€.
(bigint 1)) ;=> 1N
biginteger
ν¨μλ java.math.BigIntegerλ₯Ό λ§λ λ€.
(biginteger 1) ;=> 1
(type (biginteger 1)) ;=> java.math.BigInteger
ν΄λ‘μ μμ λΆλ μμμ μ€μ μμ μκΈ° μμ μΌλ‘ νκ°λλ κ°(value)μ΄λ€. ν΄λ‘μ μμ μ€μνμ
μλ°μ 'κΈ°λ³Έ(primitive) μλ£ν double' νμ
μ λ΄λΆμ μΌλ‘ κ°μΈκ³ μλ wrapper classμΈ
java.lang.Double
ν΄λμ€μ μΈμ€ν΄μ€μ΄λ€.
Note
|
ν΄λ‘μ μμλ μ€μ μ°μ°μ μλλ₯Ό λμ΄κΈ° μν λ°©λ²μΌλ‘, κΈ°λ³Έ μλ£νμΈ double νλ
λ€λ£° μ μλ λ°©λ²μ μ 곡νλ€. μ΄μ λν΄μλ
Numerics and
Mathematics μ₯μμ μμΈν λ€λ£¬λ€.
|
3.14 ;=> 3.14
(type 3.14) ;=> java.lang.Double
κ³Όνμ νκΈ°λ²(Scientific Notation)λ μ§μνλ€.
6.0221412927e23 ;=> 6.0221412927E23
μ€μ λ€μ λλ¬Έμ M
[3]μ λΆμ΄λ©΄, μ νλκ° λ³΄μ₯λλ μμμ κΈΈμ΄μ μ€μ(arbitrary-precision signed
floating point decimal)λ₯Ό ννν μ μλ€.
100.01M ;=> 100.01M
(type 100.01M) ;=> java.math.BigDecimal
(* 100.01M 100) ;=> 10001.00M
decimal?
ν¨μλ μ£Όμ΄μ§ μ«μκ° BigDecimal
νμΈμ§ νλ³νλ€.
(decimal? 0.1M) ;=> true
(decimal? 0.1) ;=> false
(decimal? 1) ;=> false
bigdec
ν¨μλ BigDecimalμ λ§λ λ€.
(bigdec 3.0) ;=> 3.0M
ν΄λ‘μ μμλ λΆμ μλ£νλ μ 곡νλ€. λΆμμ λΆλͺ¨ μ¬μ΄μ μ¬λμ(/
) κΈ°νΈλ₯Ό μ¬μ©ν΄
νννλ€. μ΄λ λΆμ, λΆλͺ¨μ μ¬λμ κΈ°νΈ μ¬μ΄μλ κ³΅λ°±μ΄ μμ΄μΌ νλ€.
1/3 ;=> 1/3
7/4 ;=> 7/4
(type 2/3) ;=> clojure.lang.Ratio
ratio?
ν¨μλ μ£Όμ΄μ§ μ«μκ° clojure.lang.Ratio
νμΈμ§λ₯Ό νλ³νλ€.
(ratio? 4/7) ;=> true
(ratio? 7) ;=> false
μ½λΆμ΄ κ°λ₯ν κ²½μ°μλ, μ½λΆλ κ°μ΄ λ°νλλ€.
2/4 ;=> 1/2
λΆμμ λΆλͺ¨λ λͺ¨λ μ μνμ΄μ΄μΌ νλ€. κ·Έλ μ§ μμΌλ©΄ μμΈκ° λ°μνλ€.
2/3.5
;>> NumberFormatException Invalid number: 2/3.5
denominator
ν¨μμ numerator
ν¨μλ μΈμλ‘ μ£Όμ΄μ§ λΆμμ λΆμμ λΆλͺ¨ λΆλΆλ§μ
λ°ννλ€.
(numerator 2/3) ;=> 2
(numerator 2/4) ;=> 1
(denominator 2/3) ;=> 3
λΆμκ° ν¬ν¨λ κ³μ°μ κ²½μ°μλ μ νν μ°μ°μ΄ 보μ₯λλ€.
(+ 1/3 2/3) ;=> 1N
(* 1/10 10) ;=> 1N
(+ 1/3 1) ;=> 4/3
λΆμμ μ€μ μ¬μ΄μ μ°μ° κ²°κ³Όλ μ€μνμ΄λ€.
(+ 1/3 1.0) ;=> 1.3333333333333333
λΆμλ₯Ό μ€μλ‘ κ°μ λ‘ νλ³ννκ³ μΆμ λμλ double
μ΄λ float
ν¨μλ₯Ό μ¬μ©νλ€.
(double 1/3) ;=> 0.3333333333333333
(float 1/3) ;=> 0.33333334
rational?
ν¨μλ μ 리μμΈμ§λ₯Ό νλ³νλ€. μ¦, μ μλ λΆμμ΄λ©΄ true
λ₯Ό λ°ννκ³ , κ·Έλ μ§
μμΌλ©΄ false
λ₯Ό λ°ννλ€.
Tip
|
ν΄λ‘μ μμ λΆμνμ λ΄λΆμ μΌλ‘ λΆμμ λΆλͺ¨κ° μ μνμΌλ‘ ꡬνλμ΄ μλ€. λ°λΌμ
λ΄λΆμ μΈ κ΅¬νμ΄ μ μνμΌλ‘ μ΄λ£¨μ΄μ§ λͺ¨λ μλ£νμ κ²½μ°, rational? ν¨μλ true λ₯Ό
λ°ννλ€κ³ μκ°νλ©΄ λλ€.
|
(rational? 1/2) ;=> true
(rational? 1) ;=> true
(rational? 2N) ;=> true
(rational? 1.0) ;=> false
rationalize
ν¨μλ μ£Όμ΄μ§ μ«μλ₯Ό μ 리μ(rational number), μ¦ μ μλ λΆμλ‘
λ³ννλ€. 무리μκ° μΈμλ‘ μ£Όμ΄μ§ κ²½μ°μλ κ°μ₯ κ·Όμ ν λΆμλ‘ λ³ννλ€.
(rationalize 1.5) ;=> 3/2
(rationalize 2/4) ;=> 1/2
(rationalize 4/2) ;=> 2
(rationalize 2) ;=> 2
(rationalize 2.0) ;=> 2N
(rationalize Math/PI) ;=> 3141592653589793/1000000000000000
(rationalize (Math/sqrt 2)) ;=> 14142135623730951/10000000000000000
μ«μ μλ£νμ λͺ¨λ λ€λ£¨μμΌλ μ΄μ μ°μ μ°μ° ν¨μλ€μ μκ°νλ€. κ·Έμ μμ, μ«μλ€μ μ’
λ₯μ
κ΄κ³ μμ΄ μ«μμΈμ§μ μ¬λΆλ₯Ό νλ³ν΄μ£Όλ ν¨μ number?
κ° μλ€.
(number? 1) ;=> true
(number? 1.0) ;=> true
(number? 1/3) ;=> true
(number? 23N) ;=> true
(number? 0.1M) ;=> true
(number? :a) ;=> false
(number? nil) ;=> false
(number? "23") ;=> false
μ¬μΉ μ°μ° ν¨μλΆν° λ€λ£¨μ΄ 보μ. μ΄ ν¨μλ€μ μ«μμ μλ£νμ κ΄κ³ μμ΄ λμνλ€.
(+ 1 2) ;=> 3
(+ 3.5 4.1) ;=> 7.6
(+ 1/3 1/4) ;=> 7/12
(- 10 5) ;=> 5
(* 7 8) ;=> 56
(/ 6 3) ;=> 2
(/ 3 4) ;=> 3/4
(/ 3 4.0) ;=> 0.75
2κ° μ΄μμ μΈμλ μ¬ μ μλ€.
(+ 1 2 3 4 5) ;=> 15
(- 10 9 8 7) ;=> -14
(* 1 2 3 4 5) ;=> 120
(/ 20 2 5) ;=> 2
μΈμκ° νλλ μμΌλ©΄, +
ν¨μλ λ§μ
μ νλ±μ 0
μ, *
ν¨μλ κ³±μ
μ νλ±μ 1
μ
λ°ννλ€.
(+) ;=> 0
(*) ;=> 1
-
μ /
ν¨μμ κ²½μ°λ, μΈμκ° νλλ μμΌλ©΄ μμΈκ° λ°μνλ€.
(-) ;>> ArityException Wrong number of args (0) passed to: core/-
(/) ;>> ArityException Wrong number of args (0) passed to: core//
μΈμκ° ν κ°λ§ μλ κ²½μ°, +
μ *
ν¨μλ μ£Όμ΄μ§ μΈμλ₯Ό κ·Έλλ‘ λ°ννμ§λ§, -
ν¨μλ λ§μ
μ μμμ, /
ν¨μλ κ³±μ
μ μμμ λ°ννλ€.
(+ 5) ;=> 5
(* 9) ;=> 9
(- 3) ;=> -3
(/ 3) ;=> 1/3
λͺ«(quotient)κ³Ό λλ¨Έμ§(remainder)λ₯Ό ꡬνλ €λ©΄, κ°κ° quot
μ rem
ν¨μλ₯Ό μ΄μ©νλ€. μ΄ λ
ν¨μλ μ€μμλ μ μ©λλ€.
(quot 10 3) ;=> 3
(rem 10 3) ;=> 1
(quot 3.7 1.1) ;=> 3.0
(rem 3.7 1.1) ;=> 0.3999999999999999
inc
μ dec
ν¨μλ 1μ© μ¦κ° λλ κ°μ μν¨λ€.
(inc 10) ;=> 11
(inc 10.1) ;=> 11.1
(inc 1/2) ;=> 3/2
(dec 10) ;=> 9
(dec 10.1) ;=> 9.1
(dec 1/2) ;=> -1/2
max
κ³Ό min
ν¨μλ κ°κ° μ£Όμ΄μ§ μΈμλ€ μ€ μ΅λκ°κ³Ό μ΅μκ°μ λ°ννλ€.
(max 1 2 3 4 5) ;=> 5
(min 1 2 3 4 5) ;=> 1
(max 1.1 2 3 4 5.5) ;=> 5.5
(min 1.1 2 3 4 5.5) ;=> 1.1
`min-key`μ `max-key`λ μ£Όμ΄μ§ μΈμλ€μ ν¨μλ₯Ό μ μ©ν΄μ λμ¨ μ΅λκ°κ³Ό μ΅μκ°μ λ°ννλ€.
(min-key #(Math/abs %) -3 1 4) ;=> 1
(apply min-key #(Math/abs %) [-3 1 4]) ;=> 1
(max-key #(Math/abs %) -3 1 4) ;=> 4
(apply max-key #(Math/abs %) [-3 1 4]) ;=> 4
κΈ°ν μν ν¨μλ java.lang.Math
ν΄λμ€μ μ μ (static) λ©μλλ₯Ό μ΄μ©ν΄μΌ νλ€.
Math/PI ;=> 3.141592653589793
Math/E ;=> 2.718281828459045
(Math/sqrt 2) ;=> 1.4142135623730951
(Math/sin (/ Math/PI 2)) ;=> 1.0
(Math/cos 0) ;=> 1.0
μ«μλ€μ λ±κ°λ₯Ό λΉκ΅ν λμλ =
ν¨μ보λ€λ ==
ν¨μλ₯Ό μ¬μ©νλ κ²μ΄ λ°λμ§νλ€. =
ν¨μλ μ«μλ€μ΄ μΈμλ‘ μ¬ κ²½μ° μ«μλ€μ νμ
κΉμ§ κ°μμΌ true
λ₯Ό λ°ννκΈ° λλ¬Έμ΄λ€.
(= 1 1.0) ;=> false
(= 0.5 1/2) ;=> false
(= 1.0 1.0 1.0) ;=> true
(= 2 2 2) ;=> true
λ°λ©΄μ ==
ν¨μλ νμ
μ΄ κ°μ§ μμλ μνμ μΌλ‘ λ±κ°μ΄λ©΄ true
λ₯Ό λ°ννλ€.
(== 1 1.0) ;=> true
(== 0.5 1/2) ;=> true
(== 1.0 1.0 1.0) ;=> true
(== 2 2 2) ;=> true
κ·Έλ¦¬κ³ ==
ν¨μλ μΈμλ€μ΄ λ°λμ μ«μνμ΄μ΄μΌλ§ νλ€. κ·Έλ μ§ μμΌλ©΄ μμΈκ°
λ°μνλ€. λ°λΌμ ==
ν¨μλ μ«μ μ μ© λ±κ° λΉκ΅ ν¨μλ‘ κΈ°μ΅νλ©΄ λλ€.
(== :a :a)
;>> ClassCastException clojure.lang.Keyword cannot be cast to java.lang.Number
λ°λ©΄μ, =
ν¨μλ μ«μ μ΄μΈμ μλ£νμ λΉκ΅νλ λ° μ£Όλ‘ μ¬μ©λλ€.
(= :a :a) ;=> true
(= "cat" "cat") ;=> true
(= [2 3] [2 3]) ;=> true
λμ λΉκ΅ ν¨μμλ <
, <=
, >
, >=
κ° μλ€.
(< 10 15) ;=> true
(<= 10 10) ;=> true
μ΄ ν¨μλ€μ 2κ° μ΄μμ μΈμλ€μ΄ μ¬ μ μλ€. μλ₯Ό λ€μ΄ (< a b c d)
μ κ°μ μμ΄ μμΌλ©΄,
μ΄λ μνμ μΌλ‘ a < b < c < d
λ₯Ό λͺ¨λ λ§μ‘±ν΄μΌ true
λ₯Ό λ°ννλ€.
(< 1 2 3 4 5) ;=> true
(< 1 2 3 3 5) ;=> false
(<= 1 2 3 3 5) ;=> true
(bit-and 2r1100 2r1001) ;=> 8
(bit-or 2r1100 2r1001) ;=> 13
(bit-xor 2r1100 2r1001) ;=> 5
zero?
ν¨μλ 0
μΈμ§λ₯Ό νλ³νλ€.
(zero? 0) ;=> true
(zero? 0.0) ;=> true
(zero? 1) ;=> false
(zero? -1) ;=> false
(zero? 1.0) ;=> false
(zero? 1/2) ;=> false
pos?
ν¨μμ neg?
ν¨μλ, κ°κ° μμμΈμ§ μμμΈμ§λ₯Ό νλ³νλ€.
(pos? 1) ;=> true
(pos? 1.0) ;=> true
(pos? 1/2) ;=> true
(pos? 0) ;=> false
(pos? -1) ;=> false
(neg? -1) ;=> true
(neg? -1.0) ;=> true
(pos? -1/2) ;=> true
(neg? 0) ;=> false
(neg? 1) ;=> false
odd?
ν¨μμ even?
ν¨μλ, κ°κ° νμμΈμ§ μ§μμΈμ§λ₯Ό νλ³νλ€. μΈμκ° μ μκ° μλλ©΄
μμΈκ° λ°μνλ€.
(odd? 1) ;=> true
(odd? 2) ;=> false
(odd? 0) ;=> false
(even? 2) ;=> true
(even? 1) ;=>false
(odd? 1.0)
;>> IllegalArgumentException Argument must be an integer: 1.0