Rust-lang/rfc#911์ ๋ํ ์ถ์ ๋ฌธ์ .
์ด ๋ฌธ์ ๋ ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ ๋ฅผ ์ํด ์ข ๋ฃ๋์์ต๋๋ค.
usize
์บ์คํธ์ ๋ํ ์์ ํฌ์ธํฐ: https://github.com/rust-lang/rust/issues/51910&mut T
์ฐธ์กฐ ๋ฐ ์ฐจ์ฉ: https://github.com/rust-lang/rust/issues/57349์์ ํ ์ ์ ํด์ผ ํ ์ผ:
const unsafe fn
์ ์ธ ์์ https://github.com/rust-lang/rust/issues/29107CTFE = https://en.wikipedia.org/wiki/Compile_time_function_execution
์ด๊ฒ์ #25609์ ์ํด ๋ซํ ์์ต๋๊น?
@Munksgaard ๊ทธ๊ฒ์ ๋จ์ง ์ปดํ์ผ๋ฌ AFAIK์ ๋ํ ์ง์์ ์ถ๊ฐํฉ๋๋ค. stdlib์๋ const fn
๋ก ๋ณ๊ฒฝํ๊ณ ํ์ ์ฌ๋ถ๋ฅผ ํ
์คํธํด์ผ ํ๋ ๋ง์ ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ์งํ ์ํฉ์ด ์ด๋ค์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ด๊ฒ์ std::ptr::null()
๋ฐ null_mut()
์ ๊ตฌํํ์ฌ 0usize as *mut _
์ ์์กดํ์ง ์๊ณ static mut *MyTypeWithDrop
๋ฅผ ์ด๊ธฐํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
ํธ์ง: ์ฃผ์ ์์ ๋ฒ์ด๋ฌ๊ธฐ ๋๋ฌธ์ ์ ๊ฑฐ๋จ
๋ถ๋ช ํ ํ์๋ฉด, ์ฌ๊ธฐ์ ์ง๋ฌธ์ ์ฃผ๋ก ๊ธฐ๋ฅ์ ์ ์ฉ์ฑ์ ๊ดํ ๊ฒ์ด ์๋๋ผ ์คํ๋ ค ๊ทธ๊ฒ์ ๊ณต์ํํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ(๋๋ ๊ทธ๊ฒ์ ๊ณต์ํํ๊ธฐ ์ํ ์ต์์ ํ๋ ์์ํฌ)์ ๊ดํ ๊ฒ์ ๋๋ค. RFC ํ ๋ก ์ ์ฐธ์กฐํ์ญ์์ค.
์ด๊ฒ์ ์ด์ ์ต์ข ์์ ํ๋ฅผ ์ํ ์ถ์ ๋ฌธ์ ์ ๋๋ค.
https://github.com/rust-lang/rust/issues/29107 ์ด ํ์๋์์ต๋๋ค.
"ํจํด๊ณผ์ ํตํฉ" ๋๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ด ์ด๋ฅผ ์ฐจ๋จํด์ผ ํ๋ค๋ ๋ฐ ๋์ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ด๋ฌํ ๋ณ๊ฒฝ ์์ด๋ ๋งค์ฐ ์ ์ฉํ๋ฉฐ ์ด๋ฌํ ๋ณ๊ฒฝ์ ๋์ค์ ์ํํ ์ ์์ต๋๋ค. ํนํ, ๊ณง ๋ด ์ฝ๋์์ const fn
๋ฅผ ์ฌ์ฉํ๊ธฐ ์์ํ๊ณ ์ถ์ต๋๋ค.
๋ฐ๋ผ์ ์ด์ ๋ํ ์์ ํ ์ํ๋ฅผ ์ฌํ๊ฐํ ์ ์๋๊ฐ?
ํ์ฌ ์ ํ๋ ํํ์ const fn
์ด๋๋ผ๋ ์ ์ฉํ ๊ธฐ๋ฅ์ด ๋ ๊ฒ์ด๋ผ๋ ๋ฐ ์์ฌ์ ์ฌ์ง๊ฐ ์์ง๋ง, ์ด ๊ฒฝ๋ก๋ฅผ ๋ ์ด์ ์งํํ๊ธฐ ์ ์ ๋ด๊ฐ ์ ๋ง ์ํ๋ ๊ฒ์ " const fn
์ ๊ทผ ๋ฐฉ์"์ ์ฌ์ฉํ์ฌ ์ ํธํ๋ ์ต์ข
๊ฒ์์ ๋ํด ์๊ฐํ๊ณ ์ค๋ช
ํฉ๋๋ค. ๊ฐ์ฅ ๋ถ๋ช
ํ ๋ฐฉ์์ผ๋ก ์ ์ฉํด ๋ณด์ด๋ ๊ธฐ๋ฅ์ ๊ณ์ํด์ ์ถ๊ฐํ๋ฉด ๊ฒฐ๊ตญ C++์ constexpr
๋์์ธ ์ ์ฒด๋ฅผ ๊ฑฐ์ ๋ณต์ฌํ๊ฒ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๊ฒ ์ฐ๋ฆฌ๊ฐ ํธํ ์ผ์
๋๊น? ์ฐ๋ฆฌ๊ฐ ์๋ผ๊ณ ๋งํ๋๋ผ๋, ๋๋ ํผํ ์ ์๊ฒ ๋ ๋๊น์ง ์ ํญ์ด ๊ฐ์ฅ ์ ์ ๊ธธ๋ก ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์์ ๋จ๊ณ๋ก ํํดํ๋ ๋์ ๋ง์ ๋์ผ๋ก ๊ทธ ๊ธธ์ ์ ํํ๋ ๊ฒ์ด ํจ์ฌ ๋ซ์ต๋๋ค.
(์์ ํ Rust ์ฝ๋์ ์๋ฏธ๋ฅผ ์์ ํ ์ ์ํ ์ ์์ด์ผ ํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ unsafe
์ (์ ์ด์ ์ผ๋ก) ์์กดํ์ง ์๋ ๋ชจ๋ ํจ์๋ ๊ฒฐ๊ตญ const
๋ก ํ์๋ ์ ์์ด์ผ ํฉ๋๋ค. unsafe
๊ฐ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ด์ด์ผ ํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ฌ๋๋ค์ด ์ด๋ป๊ฒ๋ ๊ทธ ์ ํ์ ์ํํ๋๋ก ๋ฐ์ด๋ถ์ผ ๊ฒ์
๋๋ค. ์ฐจ๋ผ๋ฆฌ ํด์ธ์์ ๋ ์์ง๋ ฅ ์๊ณ ์ ๋ฅํ๋ฉฐ ์คํ
์ด์ง ๋ฐ ์ ํ ์์ค ๊ณ์ฐ์ ์ํ ์ ํตํฉ๋ ์คํ ๋ฆฌ)
@glaebhoerl
๋๋ ํ์ฌ์ ์ ํ๋ ํํ์ const fn์ด ์ ์ฉํ ๊ธฐ๋ฅ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์์ฌํ์ง ์์ต๋๋ค. ๊ทธ๋ค์ด ์ ํธํ๋ ์ต์ข ๊ฒ์์ ๋ํด ์๊ฐํ๊ณ ๋ช ํํ๊ฒ ์ค๋ช ํ์ญ์์ค... ์ฐ๋ฆฌ๊ฐ ๊ฒฐ๊ตญ C++์ constexpr ๋์์ธ ์ ์ฒด๋ฅผ ๊ฑฐ์ ๋ณต์ฌํ๊ฒ ๋ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋์ ๋ณด์ ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ํ๋ ๊ฒ์ ๋ฌด์๋ณด๋ค๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ๊ณผ ์ธ์ด์ ์ด๋ ๋ถ๋ถ์ ๋ค๋ฃฐ ๊ฒ์ธ์ง์ ๋ํด ์๋นํ ๋ช ํํ ๊ฒฌํด๋ฅผ ๊ฐ๊ณ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ์ด๊ฒ์ ๋ด ์๊ฐ์ ์ ์์ ๋ํ ๊ด๋ จ ์์ ๋๋ ์ ๋ค๋ฆญ ์ง์๊ณผ ๋งค์ฐ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋์ด ์์ต๋๋ค.
@eddyb ์ ์ ๋ ์ต๊ทผ์ ๋งค์ฐ ๊ด๋ฒ์ํ ์ฝ๋๋ฅผ ์ง์์ ์ผ๋ก ํ๊ฐํ ์ ์๋ ๋ฐฉ์์ ๋ํด ์ค์ผ์น๋ฅผ ํ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์์๋ฅผ MIR๋ก ๋ฎ์ถ๊ณ ํด์(๊ฒฝ์ฐ์ ๋ฐ๋ผ
์ถ์ ํด์, ์์ง ํ๊ฐํ ์ ์๋ ์ ๋ค๋ฆญ์ด ์๋ ๊ฒฝ์ฐ ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ๋ถ๋ถ์
๋๋ค.
๊ทธ๋ฌ๋ "๋ด์ฅ ์ธ์ด"์ ๋งค์ฐ ๋ง์ ๋ถ๋ถ์ ์ง์ํ๋ ๊ฒ์ด ์๋นํ ์ฌ์ด ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์ ๋ก ์ค์ ์ฝ๋๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ํํด์ผ ํ๋ ํ์์ฑ์ ๋ถ๋ช์นฉ๋๋ค. ์ฆ, Vec
๋๋ ๋ค๋ฅธ ์ปจํ
์ด๋๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์์ ์ด ์ ์ฒด ํด์ ๊ณํ์ด ๋ด ๋ง์์ ๋ ๋ณต์กํด์ง๊ธฐ ์์ํฉ๋๋ค.
์ฆ, @glaebhoerl , ๊ทํ๊ฐ ์ ํธํ๋ ๋์์ ์ต์ข
๊ฒ์์ ๋ํด ๋ถ๋ช
ํ ๋ง์ํด ์ฃผ์
จ์ผ๋ฉด ํฉ๋๋ค. ๋๋ ๋น์ ์ด const fn
RFC์์ ๊ทธ๋ฐ ์๊ฐ์ ์ค์ผ์นํ๋ค๊ณ ์๊ฐํ์ง๋ง, ๋๋ ๊ทธ๊ฒ์ ๋ค์, ๊ทธ๋ฆฌ๊ณ ์ด ๋งฅ๋ฝ์์ ๋ฃ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. :)
ํ ๋น์ ๋ฌธ์ ๋ ๋ฐํ์์ผ๋ก ํ์ถํ๋ ๊ฒ์
๋๋ค.
์ปดํ์ผ ํ์/๋ฐํ์ ์ฅ๋ฒฝ์ ๋๋ ๊ฒ์ ์ด๋ป๊ฒ๋ ํ์ฉํ์ง ์์ ์ ์๋ค๋ฉด const fn
๋ก liballoc
๊ฐ ์๋ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํด์๋ ์คํ์์ ๋ฐ์ดํธ ์ฃผ์ ์ง์ ์ด ๊ฐ๋ฅํ ๊ฐ์ ์ฒ๋ฆฌํ๋ ๊ฒ๋ณด๋ค ์ด๋ฌํ ์ข
๋ฅ์ ํ ๋น์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ ์ด๋ ต์ง ์์ต๋๋ค.
๋๋ ํด๋น ์ฅ๋ฒฝ์ ํต๊ณผํด์ผ ํ ๋๋ง๋ค ๊ฐ์ ํ ๋นํ๊ณ ์ฑ์ฐ๋ ๋ฐํ์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ง๋ง ์ด๋ค ์ข ๋ฅ์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์์ ํ constexpr
์ ๊ฐ์ ํ๊ฐ๊ฐ ์๋๋ผ๋ const fn
๋ _์ฌ์ ํ_ ์์ํฉ๋๋ค. 'static
๋ฐ์ดํฐ์ ๋ํด ๋ ๋ฒ ์คํํ๋ฉด ๋๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ณ ๋ถ์์ฉ.
@nikomatsakis ๋ด๊ฐ ํ๋ ์์๋ค๋ฉด ๋๋ ๊ทธ๊ฒ์ ์ธ๊ธํ์ ๊ฒ์
๋๋ค. :) ๋๋ ์ฃผ๋ก ์๋ ค์ง ๋ฏธ์ง์ ๊ฒ์ ๋ด
๋๋ค. ์ ๋ค๋ฆญ ์์คํ
์ ์ผ๋ถ๋ก const
๊ฐ ์๋ ๋ชจ๋ ๊ฒ์ ๋ฌผ๋ก ๋ด๊ฐ C++ ๋์์ธ์ผ๋ก ์ดํดํ ๊ฒ์ ์ผ๋ถ์์ต๋๋ค. const
s ๋ฐ const
์ผ๋ฐ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐ๊ฒฐํ๋ ํ, ์ฐ๋ฆฌ๋ ์ด๋ฏธ const
๊ฐ ํด๋น ์ ํ์ ์ผ๋ถ๋ก ํฌํจ๋ ๊ณ ์ ํฌ๊ธฐ ๋ฐฐ์ด์ด ์๊ณ ์ถ์ํํ๊ณ ์ถ์ต๋๋ค. ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ด ์๋ ํจ์ฌ ๋ ๋์ ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ๋๋ ๊ฒ์
๋๋ค. const fn
๋ถ๋ถ์ด ๋ ๋ถ๋ฆฌ๋๊ณ ๊ฐ๋ณ์ ์
๋๋ค. ๋ ๋์๊ฐ ์ ๋ค๋ฆญ์์ const impl
s ๋ฐ const Trait
๊ฒฝ๊ณ์ ๊ฐ์ ๊ฒ์ ๊ฐ๋ ๊ฒ์ ์์ํ๊ธฐ ์ฝ์ง๋ง, ์ ๋ _ํ์ _ ์ด๋ฐ ์ข
๋ฅ์ ์ผ๋ฐ์ ์ธ ๊ฒ์ ๋ํ ์ ํ ๊ธฐ์ ์ด ์์ผ๋ฉฐ ์ด๋ฏธ ์ํฉ์ ํ์
ํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ์ฐพ์ผ๋ ค๊ณ ๋
ธ๋ ฅํด์ผ ํฉ๋๋ค.
Rust ์ธ์ด์ ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก ์ค์์ ์ปค๋๊ณผ ๊ฐ์ด ์ฃผ๋ก ์ ์์ค ์ ์ด๋ฅผ ํ์๋ก ํ๋ ๊ฒ๋ค์ ์ด๋ฏธ ์ถฉ๋ถํ ์ ์๋น์ค๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง Rust๊ฐ ๋ง์ ์ ์ฌ๋ ฅ์ ๊ฐ์ง ์ ์๋ ๋ ๋ค๋ฅธ ์์ญ์ ์ฃผ๋ก ๊ณ ์ฑ๋ฅ์ด ํ์ํ ๊ฒ๋ค์
๋๋ค. ๋จ๊ณ์ ๊ณ์ฐ( const fn
์ด ์ด๋ฏธ ๋งค์ฐ ์ ํ๋ ์ฌ๋ก์)์ ์ํ ๊ณต๊ฐ์ ๊ฐ๋ ฅํ ์ง์(์ด๋ค ํํ๋ก๋ )์ ๊ฒ์ ์ฒด์ธ์ ๊ฐ ๋ ์ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. (์ง๋ ๋ช ์ฃผ ๋์ Rust์์ ๋ ๋์ ์คํ
์ด์ง ๊ธฐ๋ฅ์ ๊ฐ์ถ ์ธ์ด๋ก ์ ํํ๊ธฐ๋ก ๊ฒฐ์ ํ ์ฌ๋๋ค์ ๋ ๊ฐ์ ๊ฐ๋ณ ํธ์ ์ ๋ณด์์ต๋๋ค.) ๊ธฐ์กด ์๋ฃจ์
์ด "์ฐ๋ฆฌ์ ๊ฐ๊น์ด" ์ธ์ด๋ก ๋ ๊ฒ์ธ์ง ํ์คํ์ง ์์ต๋๋ค. C++์ constexpr
, D์ ad-hoc CTFE, ์ฐ๋ฆฌ์ ์ ์ฐจ์ ๋งคํฌ๋ก -- ์ด๋ฐ ์ข
๋ฅ์ ์ผ์ ์ถฉ๋ถํ ์๊ฐ์ ์ฃผ๊ณ ๊ฐ๋ ฅํ๊ณ /์๋ฒฝํ๊ฒ ๋๊ปด์ง๋๋ค. (์ ์ฐจ์ ๋งคํฌ๋ก๋ ์์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ์ง๋ง ์ฑ๋ฅ ์งํฅ์ ์ธ ์ฝ๋ ์์ฑ๋ณด๋ค๋ ์ถ์ํ์ DSL์ ๋ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.)
์๊ฐ์ ์ฃผ๊ณ ์ถฉ๋ถํ ์ข์ ๊ฒ์ ๊ดํด์๋... ์ ๋ ์์ง ๊ทธ๊ฒ์ ๋ณด์ง ๋ชปํ๊ณ , ์ ํํ ์ด๋๋ฅผ ๋ด์ผ ํ ์ง๋ฅผ ์ ๋งํผ ์ ์ฒด ๊ณต๊ฐ์ ์ต์ํ์ง ์์ต๋๋ค. ๋ฌผ๋ก ์์ ๋ด์ฉ์ ๋ฐ๋ผ ์ฐ๋ฆฌ๋ Julia์ Terra๊ฐ ์ฌ๋ฌ ๋ฉด์์ Rust์ ์์ ํ ๋ค๋ฅธ ์ธ์ด์ฒ๋ผ ๋ณด์ผ์ง๋ผ๋ ์ต์ํ ํ ๋์ ๋ณด๊ธฐ๋ฅผ ์ํ ์ ์์ต๋๋ค. ๋๋ Oleg Kiselyov๊ฐ ์ด ๋ถ์ผ์์ ๋ง์ ํฅ๋ฏธ๋ก์ด ์ผ ์ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์ค์นผ๋ผ๋ฅผ ์ํ Lancet ๋ฐ Lightweight Modular Staging ์ ๋ํ Tiark Rompf์ ์์
์ ํ์คํ ๋ณผ ๊ฐ์น๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. @kmcallister ๊ฐ ์ข
์์ ์ผ๋ก ์ ํ์ด ์ง์ ๋ Rust๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง์ ๋ํ ํ๋ ์ ํ
์ด์
์ ๋ณธ ๊ธฐ์ต์ด ์์ต๋๋ค const
๊ทธ ์ ํ ์์ฒด๋ ์ผ์ข
์ ์คํ
์ด์ง์
๋๋ค(์ปดํ์ผ๊ณผ ๋ฐํ์ ์ฌ์ด์ ์์ ๋ถ๋ฆฌ๊ฐ ์คํ
์ด์ง์ ๋งค์ฐ ์ ์ฌํ๋ค๋ ์ ์ ๊ณ ๋ คํ๋ฉด ์์ฐ์ค๋ฝ์ต๋๋ค)... ์ฌ๋ฌ ๋ฐฉํฅ์์ ํฅ๋ฏธ๋ก์ด ์ ์ฌ์ ์ฐ๊ฒฐ์ด ๋ง๊ธฐ ๋๋ฌธ์ ๋์น ๊ฒ์ฒ๋ผ ๋๊ปด์ง ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ์๊ฒ ๋ฐ์ํ๋ ์ฒซ ๋ฒ์งธ ์๋ฃจ์
์ ์ ๋
ํ๋ค๋ฉด ๊ธฐํ์
๋๋ค. :)
(์ด๊ฒ์ ๋จ์ง ๋ธ๋ ์ธ ๋คํ์์ผ๋ฉฐ ๋๋ ๋ง์ ๊ฒ์ ๊ฑฐ์ ์๋ฒฝํ๊ฒ ํน์ฑํํ์ง ๋ชปํ์ต๋๋ค.)
๊ทธ๋ฌ๋ "๋ด์ฅ ์ธ์ด"์ ๋งค์ฐ ๋ง์ ๋ถ๋ถ์ ์ง์ํ๋ ๊ฒ์ด ์๋นํ ์ฌ์ด ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์ ๋ก ์ค์ ์ฝ๋๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์ํํด์ผ ํ๋ ํ์์ฑ์ ๋ถ๋ช์นฉ๋๋ค. ์ฆ, Vec ๋๋ ๋ค๋ฅธ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์์ ์ด ์ ์ฒด ํด์ ๊ณํ์ด ๋ด ๋ง์์ ๋ ๋ณต์กํด์ง๊ธฐ ์์ํฉ๋๋ค.
๋๋ "์ค์ ์ฝ๋"์ ํน์ฑํ์ ๋์ํ์ง ์์ต๋๋ค. ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํ์์ฑ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋๊ธฐ ๋๋ฌธ์ Rust์ ํฐ ๊ด์ฌ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ํนํ ๋ด ์ฝ๋๋ ๊ฐ๋ฅํ ๋๋ง๋ค ํ ํ ๋น์ ํผํ๊ธฐ ์ํด ๊ตฌ์ฒด์ ์ธ ๋ ธ๋ ฅ์ ๊ธฐ์ธ์ ๋๋ค.
๊ทธ๋ณด๋ค ๋ ๋ง์ ์ผ์ ํ ์ ์๋ค๋ฉด _์ข์ง๋ง_ ์ปดํ์ผ๋ฌ ๊ฐ์ ๋ถ๋ณ์ผ๋ก ์ค์ํ์ง ์์ ์ ํ์ ์ ์ ์ธ์คํด์ค๋ฅผ ๊ตฌ์ฑํ ์ ์๋ ๊ฒ์ ํ์์ ์
๋๋ค. C++ constexpr
์ ๊ทผ ๋ฐฉ์์ ๋งค์ฐ ์ ํ์ ์ด์ง๋ง ๋ด ์ฌ์ฉ ์ฌ๋ก์ ํ์ํ ๊ฒ ์ด์์
๋๋ค. ๋งค๊ฐ ๋ณ์ x
๋ฅผ ์ฌ์ฉํ์ฌ T
์ ํ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ์ ์๋ ํจ์๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค. x
, y
, z
x
, y
, z
๊ฐ ์ ํจํจ์ ๋ณด์ฅํ๋ z (์: x < y && z > 0
), ์์ ์ ์คํ๋๋ ์ด๊ธฐํ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ฒฐ๊ณผ๊ฐ static
๋ณ์๊ฐ ๋ ์ ์์ต๋๋ค.
@briansmith FWIW ๋์ผํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํ ๊ธฐํ๊ฐ ์๋ ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ๋งคํฌ๋ก์ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๊ธฐ๋ฅ์ด ์๋ ๊ฒฝ์ฐ์ ๋๋ค.
@briansmith FWIW ๋์ผํ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ๋งคํฌ๋ก์ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๊ธฐ๋ฅ์ด ์๋ ๊ฒฝ์ฐ์ ๋๋ค.
์ ์ฐจ์ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ ํ์์ x < y && z > 0
๋ฅผ ํ๊ฐํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ์ฐจ์ ๋งคํฌ๋ก๊ฐ ์์ ์ ์ธ Rust์์ ์ฌ์ฉ๋ ์ ์๊ธฐ๊น์ง๋ ์์ฃผ ๋ง์ ๋ฌ์ด ๊ฑธ๋ฆด ๊ฒ ๊ฐ์ต๋๋ค. const fn
๋ ๋ด๊ฐ ์ฌ๋ฌผ์ ์ํ๋ฅผ ์ดํดํ๋ ํ ์์ ์ ์ธ Rust _now_์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ํฅ๋ฏธ๋กญ์ต๋๋ค.
@glaebhoerl ๋๋ ์๊ฒฉํ ์์์ ์ํด ์จ์ ์ฐธ์ง ์์ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ์ถ ๋ฉ์ปค๋์ฆ์ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋๊ธฐ ๋๋ฌธ์(์ค์ LISP์ ๋ง์ฐฌ๊ฐ์ง๋ก) ์ด๋ค ์ข ๋ฅ์ ์์ ๋ชฉ์ ์ผ๋ก๋ ์ํ์ง ์์ ์ ์์ต๋๋ค.
@glaebhoerl https://anydsl.github.io/๋ ์์ผ๋ฉฐ, ์ฌ์ง์ด ๋ค์์ ์ฌ์ฉํฉ๋๋ค.
Rust์ ์ ์ฌํ ๊ตฌ๋ฌธ ;) ๊ธฐ๋ณธ์ ์ผ๋ก ๋จ๊ณ์ ๊ณ์ฐ์ ๋ชฉํ๋ก ํ๊ณ ์์ต๋๋ค.
ํน์ ๋ถ๋ถ ํ๊ฐ.
2016๋
1์ 16์ผ ํ ์์ผ ์คํ 6์ 29๋ถ, Eduard-Mihai Burtescu <
[email protected]>์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
@glaebhoerl https://github.com/glaebhoerl ๋๋ ์จ์ ์ฐธ์ง ์์ ๊ฒ์ ๋๋ค
์๊ฒฉํ ์์, ํ์ถ ์ฅ์น๊ฐ ์์ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
(์ง์ง LISP์ฒ๋ผ), ๊ทธ๋์ ๋น์ ์ ์ด๋ค ์ข ๋ฅ์ ์์ ์ ์ํด ๊ทธ๊ฒ์ ์ํ์ง ์์ ์๋ ์์ต๋๋ค
๋ชฉ์ .โ
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/24111#issuecomment -172271960.
์์ ํ Rust ์ฝ๋์ ์๋ฏธ๋ฅผ ์์ ํ ์ ์ํ ์ ์์ด์ผ ํ๋ค๋ ์ ์ ๊ฐ์ํ ๋, ๊ฒฐ๊ตญ
unsafe
์ (์ ์ด์ ์ผ๋ก) ์์กดํ์ง ์๋ ๋ชจ๋ ํจ์๋const
๋ก ํ์๋ ์ ์์ด์ผ ํฉ๋๋ค. . ๊ทธ๋ฆฌ๊ณunsafe
๊ฐ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ด์ด์ผ ํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ฌ๋๋ค์ด ์ด๋ป๊ฒ๋ ๊ทธ ์ ํ์ ์ํํ๊ธฐ ์ํด ์ถ์งํ ๊ฒ์ ๋๋ค.
์๊ฐํด ๋ณด์ธ์: Rust์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ ์ ๊ณต์์ ์ผ๋ก ์ ์ํ๋ค๋ฉด unsafe
์ฝ๋๋ ์ถ์์ ์ผ๋ก/๊ธฐํธ์ ์ผ๋ก ํด์ํ์ฌ ์ปดํ์ผ ํ์์ ์ ์ฌ์ ์ผ๋ก ์์ ํ๊ณ ํ๋ช
ํ๊ฒ ํ๊ฐ๋ ์ ์์ต๋๋ค. ์ฆ, ์์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ' t ๋ฐํ์ ์์ ๊ฐ์ ์ง์ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค๋ก ์ ํํ๋ ๋์ ํ ๋น๋ ์ฃผ์์ ํด์๋งต ์กฐํ์ ํด๋น ์ ํ ๋ฐ ๊ฐ ๋๋ ์ด์ ์ ์ฌํ ๊ฒ์ผ๋ก ๋ชจ๋ ๋จ๊ณ์์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒ์
๋๋ค. ๋์์ด ์ ์๋์ง ์์ ์คํ์ rustc
์ ๋ณด์ ์ทจ์ฝ์ ๋์ _์๊ฒฉํ_ ์ปดํ์ผ๋ฌ๊ฐ ๋ณด๊ณ ํ ์ค๋ฅ์
๋๋ค. (์ด๊ฒ์ ์ปดํ์ผ ํ์์ isize
๋ฐ usize
๋ฅผ ๊ธฐํธ์ ์ผ๋ก ๋๋ ํ๋ซํผ ์ข
์์ ์ธ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ์ํฉ๊ณผ ์ฐ๊ฒฐ๋ ์๋ ์์ต๋๋ค.)
const fn
์ ๊ด๋ จํ์ฌ ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๋ฅผ ์ด๋๋ก ๋ ๋๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ํํธ์ผ๋ก๋ Box
, Vec
, Rc
, unsafe
๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฝ๋๋ฅผ ์ปดํ์ผ ํ์์ ์ฌ์ฉํ ์ ์๋ ํจ์ฌ ๋ ์ ์ฉํ ์ฝ๋๋ฅผ ์ด ์ ์์ต๋๋ค. ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํ const fn
๊ฐ ๋ ์ ์๋ ๊ฒ"์ ๋ํ ๊ฒฝ๊ณ๋ ์ด์ ๋ณธ์ง์ ์ผ๋ก _FFI๋ฅผ ํฌํจํ์ง ์๋ ๋ชจ๋ ๊ฒ_์ผ๋ก ๋ฐ๊นฅ์ชฝ์ผ๋ก ์ด๋๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ const
์ด๋ผ๋ ์์ฅ ํ์ ์ ํ ์์คํ
์์ _์ค์ ๋ก_ ์ถ์ ํ ๊ฒ์ FFI์ (์ ์ด์ ์ผ๋ก) ์์กดํ๋ ๊ฒ๊ณผ ๊ทธ๋ ์ง ์์ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌด์ธ๊ฐ๊ฐ FFI๋ฅผ ์ฌ์ฉํ๋์ง ์ฌ๋ถ๋ _์ฌ์ ํ_ ์ฌ๋๋ค์ด ์ ๋นํ๊ฒ ๋ด๋ถ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ผ๋ก ๊ฐ์ฃผํ๋ ๊ฒ์ด๋ฉฐ, ์ด ์ ํ( unsafe
๊ณผ ๋ฌ๋ฆฌ)์ _์ ๋ง_ ํด์ ํ ๊ฐ๋ฅ์ฑ์ด ์์ด ๋ณด์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์๋๋ฆฌ์ค์์๋ const
์๊ฒฉ์ด ์๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ fn
๊ฐ ์์ ๊ฒ์
๋๋ค.
๋ฐ๋ผ์ ์ฌ์ ํ ์์์ ๊ตฌํ ๋
ธ์ถ ์ ํ์ ์ค์ฌ์ผ๋ก ํ์ ํ๋ const
์ด ์์ผ๋ฉฐ ๊ฑฐ์ โโ๋ชจ๋ ๊ณณ์์ const
๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ๋ ๊ทธ๋ค์ง ๋งค๋ ฅ์ ์ผ๋ก ๋ค๋ฆฌ์ง ์๋๊ตฐ์...
์ฆ, ์์ ํฌ์ธํฐ์ ์ฌ์ฉ์ ๋ฐํ์๊ณผ ๊ฐ์ ์ง์ ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค๋ก ๋ฐ๋์ง ์๊ณ ํ ๋น๋ ์ฃผ์์ ํด์๋งต ์กฐํ์ ๊ฐ์ ๊ฒ์ ๋๋ค.
@glaebhoerl ๊ธ์, ๊ทธ๊ฒ์ ๋ด๊ฐ ์ค๋ช ํ ๋ชจ๋ธ ๊ณผ @tsion ์ miri ๊ฐ ๊ตฌํํ๋ ๋ชจ๋ธ์ ๋๋ค.
์ผ๊ด์ฑ์ ์ํด _ํ์ํ_ ์์์ฑ ๋๋ฌธ์ FFI ๊ตฌ๋ถ์ด ๋งค์ฐ ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Rust const fn
์๋ unsafePerformIO
๊ฐ ์๊ธฐ ๋๋ฌธ์ GHC ๋ฅผ ์ฌ์ฉํ ์๋ _์์ต๋๋ค_.
๋๋ const
ํค์๋๋ฅผ ๋๋ฌด ์ข์ํ์ง ์๊ธฐ ๋๋ฌธ์ const fn foo<T: const Trait>
const fn foo<T: Trait>
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค( const impl Trait for T
ํ์).
Sized
์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐ๋ณธ๊ฐ์ด ์๋ชป๋์์ ์ ์์ง๋ง ํ์ค์ ์ผ๋ก ์๋ํ ์ ์๋ ๋ค๋ฅธ ์ ์์ ๋ณธ ์ ์ด ์์ต๋๋ค.
@eddyb https://internals.rust-lang.org/t/mir-constant-evaluation/3143/31 (๋๊ธ 31์ด ์๋ 11)์ ์ฐ๊ฒฐํ๋ ค๋ ๊ฒ ๊ฐ์ต๋๋ค.
@tsion ๊ณ ์ , ๊ฐ์ฌํฉ๋๋ค!
๋ด๊ฐ ์์ ํ ๋ฒ์ด๋ฌ๋ค๋ฉด ์ด๊ฒ์ ๋ฌด์ํ์ญ์์ค.
์ด RFC์์ ๋ณผ ์ ์๋ ๋ฌธ์ ๋ ์ฌ์ฉ์๋ก์ ๊ฐ๋ฅํ ํ ๋ง์ ํจ์ const fn
๋ฅผ ํ์ํด์ผ ํ๋ค๋ ๊ฒ์
๋๋ค. ์๋ํ๋ฉด ์ด๊ฒ์ด ์๋ง๋ ๋ชจ๋ฒ ์ฌ๋ก์ผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ฐ์ ์ผ์ด ํ์ฌ C++์์ contexpr์ ์ฌ์ฉํ์ฌ ์ผ์ด๋๊ณ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ๋จ์ง ๋ถํ์ํ ์ฅํฉํจ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
D์๋ const fn
๊ฐ ์์ง๋ง ์ปดํ์ผ ์๊ฐ์ ๋ชจ๋ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค(์ผ๋ถ ์์ธ ์์).
์๋ฅผ ๋ค์ด
// Standalone example.
struct Point { x: i32, y: i32 }
impl Point {
fn new(x: i32, y: i32) -> Point {
Point { x: x, y: y }
}
fn add(self, other: Point) -> Point {
Point::new(self.x + other.x, self.y + other.y)
}
}
const ORIGIN: Point = Point::new(0, 0); // works because 0, 0 are both known at compile time
const ORIGIN2: Point = Point::new(0, 0); // ditto
const ANOTHER: Point = ORIGIN.add(ORIGIN2); // works because ORIGIN and ORIGIN2 are both const.
{
let x: i32 = 42;
let y: i32 = 24;
const SOME_POINT: Point = Point::new(x, y); // Error: x and y are not known at compile time
}
{
const x: i32 = 42;
const y: i32 = 24;
const SOME_POINT: Point = Point::new(x, y); // Works x and y are both known at compile time.
}
์ฐธ๊ณ ๋ก ์ ๋ ์ค์ ๋ก Rust ์ฌ์ฉ์๊ฐ ์๋๋ฉฐ RFC๋ฅผ ๋ช ๋ถ ์ ์ ์ฝ์๊ธฐ ๋๋ฌธ์ ์ ๊ฐ ๋ญ๊ฐ๋ฅผ ์๋ชป ์ดํดํ์ ์๋ ์์ต๋๋ค.
@MaikKlein RFC ํ ๋ก ์์ CTFE์ ๋ํ ๋ง์ ํ ๋ก ์ด ์์์ต๋๋ค.
์ฌ๊ธฐ์ ์ฐจ๋จ๊ธฐ๋ฅผ ์ค๋ช ํ๋ ์ต๊ทผ ๋๊ธ์ด ์์ผ๋ฉฐ ์์ ์ด ๊ทธ๋ค์ง ๋ช ํํ์ง ์์ต๋๋ค. ์ํ๊ฐ ์ด๋ป์ต๋๊น? ์ด๊ฒ์ ๊ฒฐ์น์ ์ ๊ฐ๋ก์ง๋ฌ ์ด๋ป๊ฒ ์ด๋ํ ์ ์์ต๋๊น?
์ด๊ฒ์ ๋ก์ผ์์ ์ฌ์ฉ๋ฉ๋๋ค: https://github.com/SergioBenitez/Rocket/issues/19#issuecomment -269052006
https://github.com/rust-lang/rust/issues/29646#issuecomment -271759986์ ์ฐธ์กฐํ์ธ์. ๋ํ miri๊ฐ "์ ์ญ์ ๋ถ์์ฉ"์ ๋ํ ํ๊ณ๋ฅผ ๋์๊ธฐ ๋๋ฌธ์ ๋ช ์์ฑ์ ๋ํ ์ฐ๋ฆฌ์ ์ ์ฅ์ ์ฌ๊ณ ํด์ผ ํฉ๋๋ค( @solson ๋ฐ @nikomatsakis ๋ IRC์์ ์ด์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์์ต๋๋ค).
์ด RFC์์ ๋ณผ ์ ์๋ ๋ฌธ์ ๋ ์ฌ์ฉ์๋ก์ ๊ฐ๋ฅํ ํ ๋ง์ ๊ธฐ๋ฅ const fn์ ํ์ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ๊ทธ๊ฒ์ด ์๋ง๋ ๋ชจ๋ฒ ์ฌ๋ก์ผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์์ ํจ์๋ฅผ ํธ์ถ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์๋ ์์ง๋ง ํด๋น ํจ์๊ฐ C ์ฝ๋ ๋๋ ์ ์ ์ ์ก์ธ์คํ๋ฉด ๊ณ์ฐํ ์ ์์ต๋๋ค. ํด๊ฒฐ์ฑ ์ผ๋ก const fn์ด ๋ ์ ์๋ ๊ณต์ฉ ๊ธฐ๋ฅ์ ๋ํด ๊ฒฝ๊ณ ํ๋ ๋ฆฐํธ๋ฅผ ์ ์ํฉ๋๋ค.
๋๋ ๋ฆฐํธ์ ๋ํด ๋์ํฉ๋๋ค. ๊ธฐ์กด ๋ด์ฅ ๋ฆฐํธ missing_docs
, missing_debug_implementations
๋ฐ missing_copy_implementations
์ ์ ์ฌํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ณดํธ๋ผ๊ธฐ๋ฅผ ์ผ๋ ๋ฐ๋ ์ผ์ข
์ ๋ฌธ์ ๊ฐ ์์ง๋ง... const
๊ฐ ๋๋ ๊ฒ์ ๋ช
์์ ์ผ๋ก ์ํ์ง ์๋ ํจ์์ ๋ํด ๊ฒฝ๊ณ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋์ค์ ํจ์๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ ๊ณํ์ด๊ธฐ ๋๋ฌธ์
๋๋ค. const
์ผ ์ ์๊ณ ์ธํฐํ์ด์ค๋ฅผ const
๋ก ์ปค๋ฐํ๊ณ ์ถ์ง ์์ต๋๋ค( const
์ ๊ฑฐ๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์
๋๋ค).
#[allow(missing_const)] fn foo() {}
์ด๋ฐ ๊ฒฝ์ฐ์ ํจ๊ณผ๊ฐ ์์ ๊ฒ ๊ฐ์ต๋๊น?
@eddyb @nikomatsakis " const
์ ์ ๊ฑฐํ๋ ๊ฒ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์
๋๋ค." ์์ ์ fn์ด fn
์ด _remain_ const
ํ๋ค๋ ๋ค์ด์คํธ๋ฆผ์ ๋ํ ์ฝ์์ด๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ตญ ํค์๋๋ฅผ ๊ฐ๊ณ ์ถ์ดํ๋ค๋ ๊ฒ์ ์์ํฉ๋๋ค.
std
๋ฐ ๊ธฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ผ๋ง๋ ๋ง์ const
๊ฐ ๋ฟ๋ ค์ ธ์ผ ํ๋์ง๋ ์์น์ค๋ฌ์ด ์ผ์ด์ง๋ง ๊ณต๊ฐ์ ์ผ๋ก๋ง ์๊ตฌ๋์ง ์๋ ํ ์ด๋ป๊ฒ ํผํ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ง๋ฉดํ๋ ํญ๋ชฉ, ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ํผ๋์ค๋ฌ์ด ๊ท์น์ฒ๋ผ ๋ณด์
๋๋ค.
๊ณต๊ฐ ํญ๋ชฉ์๋ง ํ์ํ๊ณ ํผ๋์ค๋ฌ์ด ๊ท์น์ฒ๋ผ ๋ณด์ด์ง ์๋ ํ.
๋๋ ์ด๊ฒ์ ์ข์ํ๋ค... ๋๋ ๊ทธ๊ฒ์ด ํผ๋์ค๋ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์๋๋ค. const fn
์ ์ํด ํธ์ถ๋๋ ํจ์๋ฅผ const๊ฐ ์๋ ํจ์๋ก ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ ์ธํฐํ์ด์ค๊ฐ ๋ณดํธ๋ฉ๋๋ค.
๊ธฐ์ ์ ์ผ๋ก notconst
ํจ์์ ์ฃผ์์ ์ถ๊ฐํ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ์
๋๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ณด๋ค const fn
๊ฐ ๋ ๋ง์ ๊ฒ์ผ๋ก ์์ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
notconst
๋ ๋ํ Rust์ ๋์์ธ ์ฒ ํ๊ณผ ๋ ์ผ์นํฉ๋๋ค. (์: " mut
, const
" ์๋)
๊ณต๊ฐ ํญ๋ชฉ์๋ง ํ์ํ๊ณ ํผ๋์ค๋ฌ์ด ๊ท์น์ฒ๋ผ ๋ณด์ด์ง ์๋ ํ.
๋๋ ์ด๊ฒ์ ์ข์ํ๋ค... ๋๋ ๊ทธ๊ฒ์ด ํผ๋์ค๋ฌ์ธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ์๋๋ค.
๋๋์ด ์์ด๋์ด์ ํ๋ฆฝ ํ๋กญ์
๋๋ค. ์ฅ์ ์ด ์์ง๋ง(๊ณต๊ฐ ์ธํฐํ์ด์ค ๊ฒฐ์ ์ ๋ด๋ฆด ๋ const fn
๊ณ ๋ ค ) ํผ๋์ค๋ฌ์ธ ์ ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์๊ฐํ์ต๋๋ค.
const fn
์ ์ํด ํธ์ถ๋๋ ํจ์๋ฅผ const๊ฐ ์๋ ํจ์๋ก ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ ์ธํฐํ์ด์ค๊ฐ ๋ณดํธ๋ฉ๋๋ค.
์ด๊ฒ์ ์ฌ์ค์ด๋ฉฐ ๋ถํํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๊ฐ ๊ณต๊ฐ ํจ์ const
๋ฅผ ํ์ํ ๋ ์์์ ์ผ๋ก ํด๋น ํจ์ const
์ ์ํด ์ ์ด์ ์ผ๋ก ํธ์ถ๋๋ ๋ชจ๋ ํจ์๋ ํ์ํ๊ณ ์์ผ๋ฉฐ ๊ธฐํ๊ฐ ์์ต๋๋ค. ์ํ์ง ์๋ ๊ธฐ๋ฅ์ ์๋ํ์ง ์๊ฒ ํ์ํ๊ณ ์์ผ๋ฏ๋ก ํฅํ ๋น const ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ๋ด๋ถ ๊ธฐ๋ฅ์ ๋ค์ ์์ฑํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
๋ค๋ฅธ ๋ฐฉ๋ฒ๋ณด๋ค
const fn
๊ฐ ๋ ๋ง์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
๋๋ ์ ์ ๋์ ์ด๋ฐ ์๊ฐ์ ํ์ง๋ง ์์ํ Rust ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌ๋ ์ดํธ์๋ง ํด๋น๋ ๊ฒ์
๋๋ค. FFI ๊ธฐ๋ฐ fns๋ฅผ const๋ก ๋ง๋๋ ๊ฒ์ ๊ฐ๋ฅํ์ง ์์ ๊ฒ์
๋๋ค. (๊ทธ๊ฒ๋ค์ด ๋จ์ง ์ ์ด์ ์ผ๋ก FFI ๊ธฐ๋ฐ์ด๋๋ผ๋, ์ด๋ ๋ง์ ์ผ์
๋๋ค), ๋ฐ๋ผ์ const fn
์ ์์ ํ ๊ธ์ก์ ๊ทธ๋ฆฌ ๋์์ง ์์ ์ ์์ต๋๋ค. ๋น์ ๊ณผ ๋ด๊ฐ ์๊ฐํ ๋๋ก.
๋ด ํ์ฌ ๊ฒฐ๋ก : ๋ช
์์ ์ด์ง ์์ const fn
๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ํค์๋๋ฅผ ๋ง์ด ์ฐ๋ ๊ฒ์ ํผํ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ ์๋ ์์ต๋๋ค.
๋ํ ๊ธฐ๋ก์ ์ํด notconst
๋ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์
๋๋ค.
@solson ์์ฃผ ์ข์ ์ง์ ์ ๋๋ค.
ํค์๋๋ฅผ ํน์ฑ ๋ฐฉ๋ฒ๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ํค์๋๊ฐ ๋ ๋ง์์ง๋ค๋ ์ ์ ์ผ๋์ ๋์ญ์์ค. ํน์ฑ ์ ์๋ก ์ ํํ๋ ๊ฒ์ ์ถฉ๋ถํ ์ ์ฉํ์ง ์์ผ๋ฉฐ impls์ ์ฃผ์์ ์ถ๊ฐํ๋ฉด ๋ถ์์ ํ "const fn parametrim" ๊ท์น์ด ์์ฑ๋ฉ๋๋ค.
์ด ์ ์ถฉ์์ ์ฒ์์ const fn
๋ฅผ ์ฑํํ์ ๋ ๊ฝค ์ฒ ์ ํ๊ฒ ๋
ผ์๋ ๊ฒ ๊ฐ์ต๋๋ค. @solson ๋ ์ ๋ถ์๋ ๋ง๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ณ๊ฒฝ๋ ์ ์ผํ ๊ฒ์ ์๋ง๋ constable fns์ ๋น์จ์ด ๋ ์ปค์ก๋ค๋ ๊ฒ๋ฟ์ด์ง๋ง ์ฌ๊ธฐ์ ๊ทผ๋ณธ์ ์ธ ์ ์ถฉ์์ ๋ณ๊ฒฝํ ๋งํผ ์ถฉ๋ถํ ์๊ฐํ์ง ์์ต๋๋ค. const fn
๋ฅผ ๊ณต์ฉ ์ธํฐํ์ด์ค ๋ฑ์ ์ ์ฐจ์ ์ผ๋ก ์ถ๊ฐํด์ผ ํ๋ ๊ฒ์ ์ฑ๊ฐ์ ์ผ์ด์ง๋ง ์ด๊ฒ์ด ์ธ์์
๋๋ค.
@nikomatsakis ๋๋ฅผ ๊ดด๋กญํ๋ ๊ฒ์ ๋ค์ ๋ ๊ฐ์ง ์ฌ์ค์ ์กฐํฉ์ ๋๋ค.
unsafe
์ฝ๋๋ "๋์ ์ผ๋ก ๋น const"์ผ ์ ์์ต๋๋ค."๊ธ๋ก๋ฒ ๋ถ์์ฉ"์ด ์ฝ๋๊ฐ const fn
๊ฐ ๋์ง ์๋๋ก ํ๋ ์ฃผ์ ์์ธ์ด๋ผ๋ ์ ์ ๊ฐ์ํ ๋ ์ด๊ฒ์ด Rust๊ฐ ๊ฐ์ง๊ณ ์๋ ์ ๊ฑฐ๋ "ํจ๊ณผ ์์คํ
"์ด ์๋๋๊น?
"ํจ๊ณผ ์์ ์ฑ"์ ๋ํด ์ด์ผ๊ธฐํด์ผ ํ์ง ์์ต๋๊น? ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ IMO๋ฅผ ํจ๋ํ์ง ์๋๋ค๊ณ ๊ฐ์ ํ๋ ์ฝ๋์ ์ ์ฌํด ๋ณด์
๋๋ค.
@eddyb ์ ๋์ ์ผ๋ก const
๋ ํจ๊ณผ ์์คํ
์ด๊ณ ์, ๊ฐ๋ฅํ ํ ํผํ๊ณ ์ถ๊ฒ ๋ง๋๋ ๋ชจ๋ ๋จ์ ์ด ์์ต๋๋ค... ์ถ๊ฐํ๋ ๊ณ ํต์ ๊ฒฌ๋๋ ค๋ฉด ๊ทธ๋ด๋ฏํฉ๋๋ค. ํจ๊ณผ ์์คํ
์์ ๋ค๋ฅธ ์ข
๋ฅ์ ํจ๊ณผ๋ก ํ์ฅํ ์ ์๋ ์ผ๋ถ ๊ตฌ๋ฌธ์ ๊ณ ๋ คํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ๋ unsafe
์ ๋น์ทํ ๊ฐ๊ฒฉ์ ์ง๋ถํ๊ณ ์์ต๋๋ค(ํจ๊ณผ๋ ์์). ํ์ง๋ง ๊ทธ๊ฒ๋ค์ ํตํฉํ๋ ๊ฒ์ ๋ํด ์๊ฐํ๋ ๊ฒ์ด ์ด์น์ ๋ง๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์๋ฐ์ด ๋์ ์ผ๋ก ๋ฐ์ํ ์ ์๋ค๋ ์ฌ์ค์ด ์ด ์ตํธ์ธ์ ์ ํํด์ผ ํ๋ ํจ์ฌ ๋ ๋ง์ ์ด์ ์ฒ๋ผ ๋ณด์ ๋๋ค.
์ด๊ฒ์ ์ด๋ค๊ฐ์:
์ผ๋ฐ์ ์ผ๋ก const fn
s๋ ์์ฑ์( new
) ๋๋ ์ ๋์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋๋๋ก ์์๋ฅผ ํธ๋ฆฌํ๊ฒ ์์ฑํ๊ธฐ ์ํด ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค. constness๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํ์ง๋ง ์ ์ํ๋ ๋ชจ๋์ ๋ํด์๋ง ์ด ๋ฌธ์ ๋ฅผ ๋ง์ ๊ฒฝ์ฐ์ ํด๊ฒฐํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด const
๋ก ๋ช
์์ ์ผ๋ก ๋ณด์ฅ๋์ง ์๋ ํ ์ข
์ ํญ๋ชฉ์ constness๋ฅผ ๊ฐ์ ํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ๊ฒ์ const ๋ก ๋ง๋ค์ง ์๊ณ ํจ์๋ก ์์๋ฅผ ์์ฑํ ์ ์๋ ํธ๋ฆฌํจ์ ์ ์งํฉ๋๋ค.
@torkleyy ๋ด๋ณด๋ด์ง ์์ ๋์ฐ๋ฏธ๊ฐ ์์ผ๋ฉด ์ด๋ฏธ ํ ์ ์์ต๋๋ค.
๊ฐ์ธ ๋์ฐ๋ฏธ ํจ์๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์์์ ์ผ๋ก const
ํด์๋ ์ ๋๋ค๋ ๊ฐ๋ ฅํ ์ฃผ์ฅ์ด ์์ต๋๋ค. @solson ์ ๋์ฐ๋ฏธ ํจ์์ ๋ํด์๋ const
๋ฅผ ๋ช
์์ ์ผ๋ก ๋ง๋ค๋ฉด ํ๋ก๊ทธ๋๋จธ๊ฐ ์ผ์ ์ค์งํ๊ณ ํด๋น ํจ์๋ฅผ const
๋ก ์ปค๋ฐํ ์ง ์ฌ๋ถ๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค๊ณ ๋งํ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด๋ฏธ ๊ณต์ฉ ๊ธฐ๋ฅ์ ๋ํด ์๊ฐํด์ผ ํ๋ค๋ฉด ๊ทธ๊ฒ์ผ๋ก ์ถฉ๋ถํ์ง ์์ต๋๊น? ์ฌ๊ธฐ์ ๊ธฐ์ const
๋ฅผ ์ฐ์ง ์์๋ ๋๋ ๊ฒ ์๋๊ฐ์?
IRC ์์ @eddyb ๋ ์ ์ธ๊ณผ ๋ณธ๋ฌธ์ ์ธ๋ถ ์ฌํญ์ ํ์ ํ๊ธฐ ์ ์ const fns์ ๋ํ ํธ์ถ ์ ์์ ํํ ์ ์๋๋ก ์ด ๊ธฐ๋ฅ ๊ฒ์ดํธ๋ฅผ ๋ถํ ํ ๊ฒ์ ์ ์ํ์ต๋๋ค. ์ข์ ์๊ฐ ๊ฐ๋์?
@durka ์ปดํ์ผ๋ฌ ๋ด๋ถ์ ๋ํด ์ ๋ชจ๋ฅด๋ Rust ์ฌ์ฉ์์ธ ์ ์๊ฒ๋ ์ ๋ง ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
์ดํด๊ฐ ๋ถ์กฑํด์ ์ฃ์กํฉ๋๋ค. ํ์ง๋ง ์ ์ธ์ ์์ ํํ์ง ์๊ณ const
ํจ์์ ๋ํ ํธ์ถ์ ์์ ํํ๋ค๋ ๊ฒ์ ๋ฌด์์ ์๋ฏธํฉ๋๊น?
์ปดํ์ผ๋ฌ๊ฐ ์ด๋ค ์๋จ์ ํตํด ์์์ ์์๊ฐ ์๋ ๊ฒ์ ์ด๋ป๊ฒ๋ ์ ์ ์์ง๋ง ํด๋น ๋ถ๋ถ์ ๋น๋ถ๊ฐ ํ ๋ก /๊ตฌํ์ ์ํด ์ด์ด ๋ก๋๋ค.
์ปดํ์ผ๋ฌ๊ฐ ๋์ค์ ์์๊ฐ ๋ฌด์์ธ์ง์ ๋ํด ๋ง์์ ๋ฐ๊ฟ ์ ์๋ค๋ฉด ํธ์ถ์ ์ด๋ป๊ฒ ์์ ํํ ์ ์์ต๋๊น?
@nixpulvis ์ผ๋ถ const fn
๋ ์ด๋ฏธ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์กด์ฌํฉ๋๋ค(์ UnsafeCell::new
). ์ด ์ ์์ ์๋ฅผ ๋ค์ด static
ํญ๋ชฉ์ ์ด๋์
๋ผ์ด์ ์ ๊ฐ์ด ์ผ์ ํ ์ปจํ
์คํธ์์ ์ด๋ฌํ ํจ์๋ฅผ ํธ์ถํ ์ ์๋๋ก ํฉ๋๋ค.
@nixpulvis ๋ด ๋ง์ ์์ ์ ์ธ Rust ์ฝ๋์ ์ ์๋ ์ผ๋ฐ ํจ์๊ฐ ์๋๋ผ ์์ ์ปจํ
์คํธ์์ ๋ถ์์ ํ ์ฌ์ฉ ์ฝ๋(์: ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ ์ํด ์ ์๋ const fn
ํจ์์ ๋ํ ํธ์ถ์ ์๋ฏธํ์ต๋๋ค.
cc @rust-lang/lang on https://github.com/rust-lang/rust/issues/24111#issuecomment -310245900
๋๋ ๋ ๋นจ๋ฆฌ ์ผ์ด๋ ์ ์๋ค๋ฉด ๋จผ์ const fn
์ ๋ํ ํธ์ถ์ ์์ ํํ๋ ๊ฒ์ ์ฐฌ์ฑํ์ง๋ง ๋ชจ๋ const fn
๊ธฐ๋ฅ์ ์์ ํํ๋ ๊ฒ์ ์ฐจ๋จํ๋ ๊ฒ์ด ๋ฌด์์ธ์ง ๋ช
ํํ์ง ์์ต๋๋ค. ์ค๋๋ ๋จ์ ์๋ ์ฐ๋ ค ์ฌํญ์ ๋ฌด์์
๋๊น? ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ฒฝ๋ก๋ ๋ฌด์์
๋๊น?
@SimonSapin ์ค๋๋ ํ์ฅ์ฑ์ด ์ข์ const fn
๋ฅผ ์ ์ธํ๊ธฐ ์ํ ๋์์ธ์ด ๋ช
ํํ์ง ์๊ณ ์ด๋ค๊ณผ ํน์ฑ ์ฌ์ด์ ์ํธ ์์ฉ ๋ฐ ์ผ๋ง๋ ๋ง์ ์ ์ฐ์ฑ์ด ์์ด์ผ ํ๋์ง ํ์ ํ ์ ์์ต๋๋ค.
๋๋ const fn์ ์ฌ์ฉ์ ์์ ํํ๋ ค๋ ๊ฒฝํฅ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ด๊ฒ์ ์ธ์ฒด ๊ณตํ์ ์ด๊ณ ํํ๋ ฅ์ด ๋ฐ์ด๋๋ฉฐ "์ผ๋ฐ ์ฝ๋๋ฅผ ์์ฑ"ํ๋ ๊ฒ๋ณด๋ค ์ปดํ์ผ ์๊ฐ ์์ ํ๊ฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ ์ฌ์ ํ ์์ํ ์ ์์ต๋๋ค.
const fn์ ์ฌ์ฉ์ ์์ ํํฉ๋๋ค.
์ด๊ฒ์ ๋ํ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ ๊ธฐ๋ฅ์ const
๋ก ์์ ํํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ ์ต์ํ ๊ฐ์ฌ๋ฅผ ์ํํด์ผ ํฉ๋๋ค.
@petrochenkov๋น ๊ฐ์ฌํ ๊ธฐ๋ฅ ๋ชฉ๋ก๊ณผ ํจ๊ป ํธ์ถ์ ์์ ํํ๊ธฐ ์ํด PR https://github.com/rust-lang/rust/issues/43017 ์ ์ ์ถํ์ต๋๋ค.
ํน์ ํน์ฑ/impl ์ํฉ์์ ์ด๊ฒ์ด ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง์ ๋ํ ์ง๋ฌธ/์๊ฒฌ์ด ์์ต๋๋ค. Zero
ํน์ฑ์ ๊ฐ์ง ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
pub trait Zero {
fn zero () -> Self;
}
์ด ํน์ฑ์ $#$ Vec
$#$ ์ ์ํด ๋ท๋ฐ์นจ๋๋ ์ผ๋ถ BigInt
์ ํ์ ์ํด ์์๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ๋๋ฌธ์ zero
๋ฉ์๋๊ฐ const
์ผ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ธฐ๊ณ ์ค์นผ๋ผ ๋ฐ ๊ธฐํ ๋จ์ ์ ํ์ ๊ฒฝ์ฐ ๋ฉ์๋ ๊ฐ const
์ด๋ฉด ํจ์ฌ ๋ ์ค์ฉ์ ์
๋๋ค.
impl Zero for i32 {
const fn zero () -> i32 { 0 } // const
}
impl Zero for BigInt {
fn zero () -> BigInt { ... } // not const
}
ํน์ฑ์ ๋ฉ์๋๊ฐ const
์ผ ํ์ ๋ ์์ง๋ง const
๋ ๊ตฌํ์ ์ ํ์ ์ถ๊ฐํ๊ณ ๋ฌด์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ํ์ฉ๋์ด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์ผ๋ถ ์ ํ์ ๋ํด ๋์ผํ ๊ธฐ๋ฅ์ ์ผ๋ฐ ๋ฒ์ ๊ณผ const
๋ฒ์ ์ ๊ฐ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ๊ถ๊ธํ ์ ์ ์ด ๋ฌธ์ ๊ฐ ์ด๋ฏธ ํด๊ฒฐ๋์์ต๋๊น?
ํน์ฑ์ ๋ค๋ฅธ ๊ตฌํ์ด ๋ค๋ฅด๊ฒ ๋์ํ๊ธฐ๋ฅผ ์ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น? ์ผ๋ฐ ์ปจํ ์คํธ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. const fn์ ์ฌ์ฉํ์ฌ ์ค์นผ๋ผ์ ๋ก์ปฌ impl์ ๋ง๋ค ์ ์์ต๋๋ค.
@Daggerbot ์ด๊ฒ์ด ๋ด๊ฐ ํน์ฑ์์ const fn
์ ๋ํด ์์ผ๋ก ๋ณผ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์
๋๋ค. ํน์ฑ์ ๊ฐ๋ ๊ฒ์ ๋ชจ๋ impls๊ฐ const fn
์ฌ์ผ ํ๋ค๋ ๊ฒ์ ์๊ตฌํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ผ๋ก " const impl
s"๋ฅผ ๊ฐ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ์ผ๋ฐ์ ์
๋๋ค. .
@jethrogb constness ๊ฐ impl์ ์์ฑ์ด ๋์ด์ผ ํ์ง๋ง ๊ฐ๋ฅํฉ๋๋ค.
๋ด๊ฐ ์ผ๋์ ๋๊ณ ์๋ ๊ฒ์ ์๋ฅผ ๋ค์ด T: Zero
๋ฐ์ด๋๊ฐ ์๋ ์ผ๋ฐ const fn
์๋ $#$7$#์ ๋ํ impl
์ Zero
๊ฐ ํ์ํ๋ค๋ ๊ฒ์
๋๋ค T
s ํธ์ถ์ด ์์ ์ปจํ
์คํธ ์์ฒด(์: ๋ค๋ฅธ const fn
)์์ ์ฌ ๋ const fn
๋ฉ์๋๋ง ํฌํจํ๊ธฐ ์ํด ํธ์ถ๋ฉ๋๋ค.
์๋ฒฝํ์ง๋ ์์ง๋ง ๋ ๋์ ๋์์ด ์ ์๋์ง ์์์ต๋๋ค. ๊ฐ์ฅ ๊ฐ๊น์ด IMO๋ "์ปดํ์ผ ํ์์ ๋ถ๊ฐ๋ฅํ ๊ฒ์ด ์๋๋๋ฉด ํธ์ถ ์คํ์์ ๊น์ ์ค๋ฅ์ ํธ์ถ์ ํ์ฉ"ํ๋ ๊ฒ๋งํผ ๋์์ง๋ ์์ต๋๋ค. ์ฒซ ์ธ์์ ๋ณด์ผ ์ ์์ต๋๋ค - ๊ทธ๊ฒ์ ๋ํ ๋๋ถ๋ถ์ ์ฐ๋ ค๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค์ด const fn
ํจ์๋ฅผ ํ์ํ๋ฉด ์ฌ์ค์ด ๊ธฐ๋ก๋๊ณ ์ปดํ์ผ ํ์์ ์ ํจํ์ง ์์ ์์
์ ์ํํ๋ ๊ฒ์ ๊ทธ๋ ์ง ์๋๋ก ํด์ผ ํฉ๋๋ค. const fn
.
์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ต๋๊น?
pub trait Zero {
fn zero() -> Self;
}
pub trait ConstZero: Zero {
const fn zero() -> Self;
}
impl<T: ConstZero> Zero for T {
fn zero() -> Self {
<Self as ConstZero>::zero()
}
}
์์ฉ๊ตฌ๋ ๋งคํฌ๋ก๋ก ์ค์ผ ์ ์์ต๋๋ค.
๊ฑฐ์ ๋๊ฐ์ ์ผ์ ํ๋ ๋ ๊ฐ์ ๊ฐ๋ณ ํน์ฑ( Zero
๋ฐ ConstZero
)์ด ์๋ค๋ ์ฌ์ํ ๋ถํธ์ ์ ์ธํ๊ณ ๋ ํฌ๊ด์ ์ธ ๊ตฌํ์ ์ฌ์ฉํ ๋ ์ ์ฌ์ ์ธ ๋ฌธ์ ๊ฐ ํ๋ ์์ต๋๋ค.
// Blanket impl
impl<T: ConstZero> Zero for T {
fn zero () -> Self { T::const_zero() }
}
pub struct Vector2<T> {
pub x: T,
pub y: T,
}
impl<T: ConstZero> ConstZero for Vector2<T> {
const fn const_zero () -> Vector2<T> {
Vector2 { x: T::const_zero(), y: T::const_zero() }
}
}
// Error: This now conflicts with the blanket impl above because Vector2<T> implements ConstZero and therefore Zero.
impl<T: Zero> Zero for Vector2<T> {
fn zero () -> Vector2<T> {
Vector2 { x: T::zero(), y: T::zero() }
}
}
๋ธ๋ญํท impl์ ์ ๊ฑฐํ๋ฉด ์ค๋ฅ๊ฐ ์ฌ๋ผ์ง๋๋ค. ๋์ฒด๋ก ์ด๊ฒ์ ์ธ์ด์ ์ต์ํ์ ๋ณต์ก์ฑ์ ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ฌ์์ ๊ตฌํํ๊ธฐ ๊ฐ์ฅ ์ฌ์ธ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ ํ์ํ์ง ์์ ๊ตฌํ๋ ๋ฉ์๋์ const
๋ฅผ ์ถ๊ฐํ ์ ์๋ค๋ฉด ์๋ฒฝํ์ง๋ ์์ง๋ง ์ด๋ฌํ ์ค๋ณต์ ํผํ ์ ์์ต๋๋ค.
impl<T: Zero> Zero for Vector2<T> {
const fn zero () -> Vector2<T> {
Vector2 { x: T::zero(), y: T::zero() }
}
}
IIRC, C++์์๋ constexpr
๋ก ์์
ํ ๋ ์ด์ ๊ฐ์ ๊ฒ์ ํ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์ ๋จ์ ์ ์ด const
๊ฐ <T as Zero>::zero
๋ const
์ธ ๊ฒฝ์ฐ์๋ง ์ ์ฉํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์ค๋ฅ์ฌ์ผ ํฉ๋๊น, ์๋๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์ ์ฉํ ์ ์๋ ๊ฒฝ์ฐ(์: C++) ์ด const
๋ฅผ ๋ฌด์ํด์ผ ํฉ๋๊น?
์ด๋ฌํ ์ ์ค ์ด๋ ๊ฒ๋ ๋ฌธ์ ๋ฅผ ์๋ฒฝํ๊ฒ ํด๊ฒฐํ์ง ๋ชปํ์ง๋ง ๋ ๋์ ๋ฐฉ๋ฒ์ด ์๊ฐ๋์ง ์์ต๋๋ค.
ํธ์ง: @andersk ์ ์ ์์ ์ฒซ ๋ฒ์งธ ์๋ฅผ ์ค๋ฅ ์์ด ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์๋ง๋ ์ปดํ์ผ๋ฌ ๊ตฌํ์ด ์งํ๋๋ ํ ์ต๊ณ ์/๊ฐ์ฅ ๊ฐ๋จํ ์๋ฃจ์ ์ด ๋ ๊ฒ์ ๋๋ค.
@Daggerbot ์ด๊ฒ์ RFC 1210(์ ๋ฌธํ) ์ ๋ ๋ถ๋ถ์ ์ ์๋ "๊ฒฉ์" ๊ท์น์ ์ฌ์ฉ ์ฌ๋ก์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ๋น์ ์ด ์ฐ๋ ๊ฒฝ์ฐ
impl<T: ConstZero> Zero for T {โฆ} // 1
impl<T: ConstZero> ConstZero for Vector2<T> {โฆ} // 2
impl<T: Zero> Zero for Vector2<T> {โฆ} // 3
impl<T: ConstZero> Zero for Vector2<T> {โฆ} // 4
1์ 3๊ณผ ๊ฒน์น์ง๋ง ๊ต์ฐจ์ ์ ์ ํํ 4๋ก ๋ฎ์ฌ ์์ผ๋ฏ๋ก ๊ฒฉ์ ๊ท์น์ ๋ฐ๋ผ ํ์ฉ๋ฉ๋๋ค.
http://smallcultfollowing.com/babysteps/blog/2016/09/24/intersection-impls/๋ ์ฐธ์กฐํ์ญ์์ค.
๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ํผํ๊ณ ์ถ์ ์์ฒญ๋๊ฒ ๋ณต์กํ ์์คํ ์ ๋๋ค.
์, ๊ฒฉ์ ๊ท์น์ด ํ์ํฉ๋๋ค.
@eddyb ๋ฌด์์ด ๋ณต์กํ๋ค๊ณ ์๊ฐํ์ญ๋๊น?
@Kixunil impl
๋ฅผ const fn
๋ก "๋จ์ํ" ํ์ํ๋ ๋์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฑฐ์ ๋ชจ๋ ๋จ์ผ ํน์ฑ์ ๋ณต์ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ๋ฒ์ด๋๊ณ ์์ต๋๋ค. ํ์ฌ ๋ฌธ์ ๋ const fn
์ ์ฌ์ฉ ์์ ํ์ ๊ดํ ๊ฒ์
๋๋ค. const fn
ํน์ฑ ๋ฉ์๋ ๋๋ const impl Trait for Foo
ํ์ฉ์ ์๋ก ๋ฐ ํ์ฉ๋๋ RFC์ ์ง๊ตํฉ๋๋ค.
@oli-obk ์ด๊ฒ์ ์๋ก์ด RFC๊ฐ ์๋๋ผ const fn
์ ๋ํ ์ถ์ ๋ฌธ์ ์
๋๋ค.
๋ฐฉ๊ธ ๋์น์ฑ๊ณ ๋๊ธ ์์ ํ์ต๋๋ค.
@eddyb ๋ค, ํ์ง๋ง ์ปดํ์ผ๋ฌ์์๋ ๋ ๊ฐ๋จํ๊ณ (ํนํ๋ฅผ ๋นผ์ง๋ง ์ด์จ๋ ํนํ๋ฅผ ์ํ ๊ฒ์
๋๋ค) ์ฌ๋๋ค๋ ConstTrait
๋ก ๋ฌถ์ ์ ์์ต๋๋ค.
์ด์จ๋ ๋๋ impls๋ฅผ const๋ก ํ์ํ๋ ๊ฒ์ ๋ฐ๋ํ์ง ์์ต๋๋ค. ๋๋ ๋ํ ConstTrait: Trait
์๋ ์์ฑ ์ปดํ์ผ๋ฌ๋ฅผ ์์ํ๊ณ ์์ต๋๋ค.
@Kixunil ํนํ ์ ๋ฌธํ๋ก ํ ์ ์๋ค๋ฉด ํจ์ฌ ๊ฐ๋จํ์ง ์์ต๋๋ค.
์ปดํ์ผ๋ฌ๋ ConstTrait: Trait
์ ๊ฐ์ ๊ฒ์ ์๋ ์์ฑํ ํ์๋ ์๊ณ ํน์ฑ ์์คํ
์ด ์ด๊ฒ์ ๋ํด ์ ํ์๋ ์์ต๋๋ค. ๊ตฌํ์ ํตํด ์ฌ๊ทํ๋ฉด ๋ฉ๋๋ค(๊ตฌ์ฒด์ ์ธ impl
๋๋ where
bound) ํธ๋ ์ ์์คํ
์ด ์ ๊ณตํ๊ณ ํ์ธํฉ๋๋ค.
const fns๊ฐ UnsafeCell
์ ๋ํ ์ก์ธ์ค๋ฅผ ํ์ฉํ์ง ์์์ผ ํ๋์ง ๊ถ๊ธํฉ๋๋ค. ์๋ง๋ ์ง์ ํ const ๋์์ ํ์ฉํด์ผ ํ ๊ฒ์
๋๋ค.
const fn dont_change_anything(&self) -> bool {
let old = self.cell.get();
self.cell.set(!old);
old
}
์ง๊ธ๊น์ง ๋๋ set
๊ฐ const
$ ์ด ์๋๋ผ๋ ๊ฒ์ ๋ณด์์ต๋๋ค. ๋ฌธ์ ๋ ์ด๊ฒ์ด ์์ํ ์ง์๋ ๊ฒ์ธ์ง ์ฌ๋ถ์
๋๋ค. ๋ค์ ๋งํด, unsafe
์ฝ๋๊ฐ ๋ถ๋ณ ๋ฐ์ดํฐ์ ๋ํด ๋์ผํ const
ํจ์๋ฅผ ์คํํ ๋ ํ์ฌ์ ์ธ์ด/๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชจ๋ ํฅํ ๋ฆด๋ฆฌ์ค์์ ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ ์ ์์ต๋๊น?
const fn
๋ ๋ถ๋ณ์ ์๋ฏธํ๋ ๊ฒ์ด ์๋๋ผ ์ปดํ์ผ ํ์์ ํธ์ถ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.
๋ด๊ฐ ์ฐธ์กฐ. ์ด๋ป๊ฒ๋ ๊ฐ๋ฅํ๋ค๋ฉด unsafe
ํน์ฑ์ ์ฌ์ฉํ์ง ์๊ณ ํจ์๊ฐ ์ฌ๋ฌ ๋ฒ ํธ์ถ๋ ๋ ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ์ ์ด๋ป๊ฒ๋ ๋ณด์ฅํ ์ ์๋ค๋ฉด ๋๋จํ ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
@Kixunil ์ํ๋ https://github.com/rust-lang/rfcs/issues/1631
@jethrogb ๋งํฌ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
mem::size_of
๊ฐ ์ผ๊ฐ์ const fn
๋ก ๊ตฌํ๋๋ค๋ ๊ฒ์ ์์์ต๋๋ค. mem::transmute
๋ฐ ๊ธฐํ ์ฌ์ฉ์์๊ฒ ์ด๊ฒ์ด ๊ฐ๋ฅํฉ๋๊น? Rust ๋ด์ฅ ํจ์๋ ์ปดํ์ผ๋ฌ ๋ด๋ถ์์ ์๋ํ๋ฉฐ ์ด๋ฅผ ํ์ฉํ๊ธฐ ์ํด ์ ์ ํ ๋ณ๊ฒฝ์ ์ํํ ๋งํผ ์ถฉ๋ถํ ์ต์ํ์ง ์์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๊บผ์ด ๊ตฌํํ๊ฒ ์ต๋๋ค.
๋ถํํ๋ ๊ฐ์ ๋ํ ์์
์ ๋ง๋ฒ์ฒ๋ผ ์ผ๋ถ๋ฅผ ์์ฑํ๋ ๊ฒ๋ณด๋ค ์ฝ๊ฐ ์ด๋ ต์ต๋๋ค. transmute
์๋ ๋ฏธ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. miri๋ฅผ ์ปดํ์ผ๋ฌ๋ก ๊ฐ์ ธ์ค๊ธฐ ์ํ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ์ด๋ฏธ ์งํ ์ค์
๋๋ค. #43628
๊ทธ๋์! *Cell::new
, mem::{size,align}_of
, ptr::null{,_mut}
, Atomic*::new
, Once::new
๋ฐ {integer}::{min,max}_value
๋ฅผ ์์ ํํ๋ ๋ฐ ๊ด์ฌ์ด ์์ผ์ญ๋๊น? ์ฌ๊ธฐ์ FCP๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ฐ๋ณ ์ถ์ ๋ฌธ์ ๋ฅผ ์์ฑํด์ผ ํฉ๋๊น?
๋ค.
๋๋ ์ด๊ฒ์ ๋ํด ๊ฒฐ์ ๊ถ์ ๊ฐ์ง ํ์ ์ผ์์ ์๋์ง๋ง ๋ด ๊ฐ์ธ์ ์ธ ์๊ฐ์ mem::{size,align}_of
๋ฅผ ์ ์ธํ ์ด ๋ชจ๋ ๊ฒ๋ค์ ๊ณ ๋ฌด ์คํฌํ์ ์์ง์์ ๊ฑฐ์น์ง ์๊ณ ์ง๊ธ ์์ ํ ๋ ์์์ ์ ๋๋ก ์ฌ์ํ๋ค๋ ๊ฒ์
๋๋ค. FCP.
์ฌ์ฉ์๋ก์ ๋๋ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ const ํํ์์์ mem::{size,align}_of
๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ง๋ง const fn
s๋ก ๋ง๋ค์ด์ก์ ๋ insta-const-stable์ด ๋๋ ๊ฒ์ ๋ํ @nikomatsakis ์ ์ฐ๋ ค ํํ์ ์ฝ์์ต๋๋ค. . ํน์ ์ฐ๋ ค ์ฌํญ์ด ์๋์ง ์๋๋ฉด ์ผ๋ฐ์ ์ธ ์ฃผ์ ์ฌํญ์ด ์๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง IIRC๊ฐ ๊ธฐ๋ฅ๋ณ ๊ธฐ๋ฅ ๊ฒ์ดํธ๊ฐ ์ถ๊ฐ๋ ์ด์ ์
๋๋ค. ์ด ๋ ๊ฐ์ง์ ๋ํ ์ฐ๋ ค๋ FCP๋ฅผ ๊ณต์ ํ ์ ์์ ์ ๋๋ก ๋น์ทํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. @rustbot ์ด ๋์ผํ GitHub ์ค๋ ๋์์ ๋ณ๋์ FCP๋ฅผ ์ฒ๋ฆฌํ ์ ์๋์ง ์ฌ๋ถ๋ ๋ชจ๋ฅด๊ฒ ์ผ๋ฏ๋ก ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ฌ๋ ๊ฒ์ด ๋ ๋์ ๊ฒ์
๋๋ค.
@durka ์ด๋ฌํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ผ๊ด์ฑ์ ์์ ํํ๊ธฐ ์ํด ๋จ์ผ ์ถ์ ๋ฌธ์ ๋ฅผ ์ด โโ์ ์์ต๋๊น? FCP๊ฐ ์ฌ๋ผ์ค๋ฉด ์ ์ํ๊ฒ ์ต๋๋ค.
alloc::Layout์ const fns์ ๋ํ ํ ๋ก ์์ ๋ฆฌ๋๋ฅผ ๋ฐ๋ฅด๋ ค๋ฉด ๋ค์์ ์ํํ์ญ์์ค.
const fn
์์ ํจ๋์ ํ์ฉํ๊ณ ์ปดํ์ผ ์ค๋ฅ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๊น? ์ด๊ฒ์ ์์ ์ฐ์ ํํ์์ผ๋ก ์ง๊ธ ์ํ๋๋ ๊ฒ๊ณผ ์ ์ฌํ์ง ์์ต๋๊น?
์, ๋ฏธ๋ฆฌ๊ฐ ๋ณํฉ๋๋ฉด ์์ฃผ ์ฌ์ํ ๊ธฐ๋ฅ์ ๋๋ค.
const
๊ฐ ๋๋ ์ถ๊ฐ std
๊ธฐ๋ฅ์ ์์ฒญํ๊ธฐ์ ์ ํฉํ ๊ณณ์
๋๊น? ๊ทธ๋ ๋ค๋ฉด Duration::
{ new
, from_secs
, from_millis
} ๋ ๋ชจ๋ const
๋ฅผ ๋ง๋๋ ๋ฐ ์์ ํด์ผ ํฉ๋๋ค.
@remexre ๊ทธ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ์๋ง๋ PR์ ๋ง๋ค๊ณ ๊ฑฐ๊ธฐ์์ libs ํ ๊ฒํ ๋ฅผ ์์ฒญํ๋ ๊ฒ์ ๋๋ค.
https://github.com/rust-lang/rust/pull/47300์ผ๋ก ํ๋ณดํ์ต๋๋ค. ๋ํ ๋ถ์์ ํ ์์ฑ์์ const
๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
์ถ๊ฐ std
ํจ์๋ฅผ const
์ ์ธํ๋๋ก ํ์ฉํ๋ ๊ฒ์ ๋ํ ์๊ฐ์ด ์์ต๋๊น? ํนํ mem::uninitialized
๋ฐ mem::zeroed
? ์ด ๋ ๊ฐ์ง๊ฐ ์ถ๊ฐ const
๊ธฐ๋ฅ์ ์ ํฉํ ํ๋ณด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ด๊ฐ ์๊ฐํ ์ ์๋ ์ ์ผํ ๋จ์ ์ Drop
๋ฅผ ๊ตฌํํ๋ ๊ตฌ์กฐ์ฒด ์์ฑ์ด ptr::write
์์ด ์์ฑ๋๊ณ ๋ฎ์ด์ฐ์ฌ์ง๋ mem::uninitialized
์ ๋์ผํ ๋จ์ ์
๋๋ค.
์ด๊ฒ์ด ์ ์ ํ๊ฒ ๋ค๋ฆฌ๋ฉด PR๋ ์ฒจ๋ถํ ์ ์์ต๋๋ค.
๊ทธ ๋๊ธฐ๋ ๋ฌด์์ ๋๊น? ๋ฎ์ด์ธ ์ ์๋ ์ ํจํ์ง ์์ ๋นํธ ํจํด์ ๋ง๋๋ ๊ฒ์ ์ธ๋ชจ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง(๊ทธ๋ค์ const์ ์๊ธฐ ๋๋ฌธ์), ์๋ง๋ ๋๋ ๋ช ๋ฐฑํ ๊ฒ์ ๊ฐ๊ณผํ๊ณ ์์ ๊ฒ์ ๋๋ค.
mem::uninitialized
๋ ์ ๋์ ์ผ๋ก ํ๊ฑด์ผ๋ก, ๋ถ์ ์ ํ๊ฒ ์กฐ์คํ๋ฉด ์์ ํตํด ์๊ธฐ๋ ํฉ๋๋ค. ์ง์งํ๊ฒ, ๋๋ unsafe
๋ก ํ์๋์ด ์์์๋ ๋ถ๊ตฌํ๊ณ ์ด ํจ์์ ์ฌ์ฉ์ด ์ผ๋ง๋ ๋ฏฟ์ ์ ์์ ์ ๋๋ก ์ํํ์ง ๊ณผ์ฅํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ถ๊ฐ ํจ์ const
๋ฅผ ์ ์ธํ๋ ๋๊ธฐ๋ ์ด๋ฌํ ํจ์์ ํน์ฑ์์ ๋น๋กฏ๋ฉ๋๋ค. mem::uninitialized<Vec<u32>>
๋ฅผ ํธ์ถํ๋ฉด ๋ถ์์ฉ ์์ด ๋งค๋ฒ ๋์ผํ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ถ๋ช
ํ ์ด๊ธฐํํ์ง ์์ ์ฑ๋ก ๋๋ฉด ์ด๊ฒ์ ๋์ฐํ ์ผ์
๋๋ค. ๋ฐ๋ผ์ unsafe
๋ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ์ฉ ์ฌ๋ก์ ๊ฒฝ์ฐ ์ผ๋ถ ๊ธฐ๋ฅ์ ์์์ ์ถ์ ํ๋ ์ ์ญ ํ์ด๋จธ๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ๋ด๋ถ ์ํ๋ ๋์ค์ ๊ฒฐ์ ๋์ง๋ง ์คํ ์ ์์ฑ๋๋ ์ ์ ์ ์ญ ๊ตฌ์กฐ์ฒด๋ก ํ์ํ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
use std::time::Instant;
pub struct GlobalTimer {
time: UnsafeCell<Instant>
}
impl TimeManager {
pub const fn init() -> TimeManager {
TimeManager {
time: UnsafeCell::new(Instant::now())
}
}
}
์ด ์ฝ๋๋ Instant::now()
๊ฐ const
ํจ์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋์ง ์์ต๋๋ค. mem::uninitialized
๊ฐ const fn
์ธ ๊ฒฝ์ฐ $ Instant::now()
๋ฅผ mem::uninitialized::<Instant>())
๋ก ๋ฐ๊พธ๋ฉด ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค. ์ด์์ ์ผ๋ก๋ ํ๋ก๊ทธ๋จ์ด ์คํ์ ์์ํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ด ๊ตฌ์กฐ๋ฅผ ์ด๊ธฐํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ฝ๋๋ ๊ด์ฉ์ ์ด์ง ์์ ๋
น์ผ๋ก ๊ฐ์ฃผ๋์ง๋ง(์ ์ญ ์ํ๋ ์ผ๋ฐ์ ์ผ๋ก ๋งค์ฐ ๋์จ) ์ ์ญ ์ ์ ๊ตฌ์กฐ๊ฐ ์ ์ฉํ ๋ง์ ๊ฒฝ์ฐ ์ค ํ๋์ผ ๋ฟ์
๋๋ค.
์ด ๊ฒ์๋ฌผ์ด ์ปดํ์ผ ํ์์ ์คํ๋๋ Rust ์ฝ๋์ ๋ฏธ๋์ ๋ํ ์ข์ ํ ๋๋ฅผ ์ ๊ณตํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ์ญ ์ปดํ์ผ ํ์ ์ ์ ๊ตฌ์กฐ๋ ํ์ฌ ๋
น์ด ์๋ ๋ช ๊ฐ์ง ์ค์ํ ์ฌ์ฉ ์ฌ๋ก(OS๋ ์ผ๋์ ๋ก๋๋ค)๊ฐ ์๋ ๊ธฐ๋ฅ์
๋๋ค. $ unsafe
mem::uninitialized
๋ฐ mem::zeroed
์ ๊ฐ์ด ์ ์ ํ๋ค๊ณ ํ๋จ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ const
๋ฅผ ์ฒ์ฒํ ์ถ๊ฐํ์ฌ ์ด ๋ชฉํ๋ฅผ ํฅํ ์์ ๋จ๊ณ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
ํธ์ง: TimeManager::init()
์ ํจ์ ์๋ช
์์ const
๋ฅผ ์์ด๋ฒ๋ ธ์ต๋๋ค.
ํ , ๊ทธ ์ฝ๋ ๋ ์ปดํ์ผ ๋๋ฏ๋ก ์ฌ๊ธฐ์ ์ ํํ ๋๊ธฐ๋ฅผ ๋์น๊ณ ์์ต๋๋ค... ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ฉด
const fn foo() -> Whatever {
unsafe {
let mut it = mem::uninitialized();
init_whatever(&mut it);
it
}
}
ํ์ง๋ง const fns๋ ํ์ฌ ๋๋ฌด ์ ํ์ ์ด์ด์ ์ธ ์๋ ์์ต๋๋ค...
์ด๋ก ์ ๊ทผ๊ฑฐ์ ๊ฐ์ฌํ์ง๋ง const
๋ pure
์ ๊ฐ์ง ์์ผ๋ฉฐ ์ผ๋ถ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ ์ฌ๋ก์ ํ์ํ์ง ์์ ๊ฒฝ์ฐ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉ์ ๊ถ์ฅํ๊ธฐ ์ํด ์๋ฌด ์กฐ์น๋ ์ทจํ์ง ์์์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. .
๋จผ์ ์์ ๋ ์ ์๋ ๋ ๋ฎ์ ๋งค๋ฌ๋ฆฐ ๊ณผ์ผ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฏธ๋ฆฌ๊ฐ ์์ผ๋ฉด ์ด๊ธฐํ๋์ง ์๊ณ 0์ด ๋๋ ๋ด์ฅ ํจ์๋ ์ด์จ๋ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ทธ๋๋ ์ธ์ ๊ฐ๋ ๋ณด๊ณ ์ถ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ธฐ์ ๊ทธ๊ฒ๋ค์ ์์ ํํ ์๋ ์๊ณ , ์ค๊ฐ ๊ณ์ฐ์ด ์ด๊ธฐํ๋์ง ์์ ์ ์๋ค ํ๋๋ผ๋ ๋ชจ๋ ์์๊ฐ ์ด๊ธฐํ๋ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋๋ก ์๊ตฌํ ์๋ ์์ต๋๋ค.
์ฆ, ๊ณต์ฉ์ฒด ๋ฐ ์์ ํ์ง ์์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ด์จ๋ ์ด๊ธฐํ๋์ง ์๊ฑฐ๋ 0์ด ๋ ๊ฒ์ ์๋ฎฌ๋ ์ดํธํ ์ ์์ผ๋ฏ๋ก ๋น const๋ก ์ ์งํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
union
์ ๋์์ผ๋ก ์ด์ ์ฝ๋๋ ์ด์ . ์์ ๊ฒ๋ ใ
ใ
ใ
์ข์ ์ ๋ค๋ ๋ชจ๋. ์ด๋ฌํ ๋ด์ฅ ํจ์๋ ์ฌ์ฉ ์ฌ๋ก ๋ชฉ๋ก์์ ๋งค์ฐ ๋ฎ์ง๋ง ์ต์ข
const
-ness์ ์ฌ์ ํ ์ ํฉํ ํ๋ณด์
๋๋ค.
์ ๋ง ๋๋์ต๋๋ค.
๊ทธ๋์... ์ ํํ mem::uninitialized๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ ์นํธํ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Instant::now?์ ๋ฐ๋ํฉ๋๋ค. :)
์์๊ฐ ์๋ ๊ตฌ์กฐ์ฒด์๋ ์์ ์ด๋์
๋ผ์ด์ ๊ฐ ํ์ํฉ๋๋ค.
๋ด๋ถ๋ ์ค์ ์
๋๋ค(์ฐธ์กฐ: Mutex). ๊ทธ๋ฌ๋ ๋๋ ์ด๊ฒ์ ๋ง๋ผํค๋ผ๊ณ ์๊ฐํ์ง ์๋๋ค.
๋ ์ฝ๊ฒ ์ป์ ์์๋ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์
๋๋ค!
2018๋
1์ 25์ผ ๋ชฉ์์ผ ์ค์ 2์ 21๋ถ, Stephen Fleischman <
[email protected]>์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๊ณต์ฉ์ฒด์ ๋์์ผ๋ก ์ด์ ์ฝ๋๋ ์ด์ ์ปดํ์ผ๋ฉ๋๋ค.
https://play.rust-lang.org/?gist=be075cf12f63dee3b2e2b65a12a3c854&version=nightly .
์์ ๊ฒ๋ ใ ใ ใ โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/24111#issuecomment-360382201 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAC3n-HyWD6MUEbfHkUUXonh9ORGPSRoks5tOCtegaJpZM4D66IA
.
Instant::now
๋ const์ผ ์ ์์ต๋๋ค. ๊ทธ ํจ์๋ ๋ฌด์์ ๋ฐํํ ๊น์? ํธ์ง์ ์๊ฐ?
๋๊ตฐ๊ฐ ์ด๊ฒ์ ์์ ํํ๊ธฐ ์ํด ์ํํด์ผ ํ ์์ ์ ์์ฝํ ์ ์์ต๋๊น? ์ด๋ค ๊ฒฐ์ ์ ๋๋ฌํด์ผ ํฉ๋๊น? ์ด ๋ชจ๋ ๊ฒ์ ์์ ํํ ์ง ์ฌ๋ถ?
ํจํด๊ณผ์ ํตํฉ(์: https://gist.github.com/d0ff1de8b6fc15ef1bb6)
์ด๋ฏธ ์์ ์ ๋ํด ์ธ๊ธํ์ง๋ง ํ์ฌ const fn
๋ ํจํด์์ ๋น๊ตํ ์ ์์ผ๋ฏ๋ก ์์ ํ๋ฅผ ์ฐจ๋จํด์๋ ์ ๋ฉ๋๋ค. ์๋ฏธ๊ฐ ์๋ ๊ฒฝ์ฐ ๋์ค์ ํญ์ ํ์ฉํ ์ ์์ต๋๋ค.
Instant::now๋ const๊ฐ ๋ ์ ์์ต๋๋ค. ๊ทธ ํจ์๋ ๋ฌด์์ ๋ฐํํ ๊น์? ํธ์ง์ ์๊ฐ?
๊ทธ๋ฌ๋ const์ธ Instant::zero()
๋๋ Instant::min_value()
๊ฐ ์์ ์ ์์ต๋๋ค.
๋๊ตฐ๊ฐ ์ด๊ฒ์ ์์ ํํ๊ธฐ ์ํด ์ํํด์ผ ํ ์์ ์ ์์ฝํ ์ ์์ต๋๊น? ์ด๋ค ๊ฒฐ์ ์ ๋๋ฌํด์ผ ํฉ๋๊น? ์ด ๋ชจ๋ ๊ฒ์ ์์ ํํ ์ง ์ฌ๋ถ?
๋๋ ์ฐ๋ฆฌ์ const fn ๊ฒ์ฌ๊ฐ const fn ๋ด๋ถ์์ ์ํ์ง ์๋ ๊ฒ์ ์ค์๋ก ํ์ฉ/์์ ํํ์ง ์์ ๋งํผ ์ถฉ๋ถํ ์๊ฒฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Rust-lang/rfcs#2272๋ฅผ ํตํด ํจํด๊ณผ ํตํฉํ ์ ์์ต๋๊น? ํจํด์ ์ด๋ฏธ ์๋ ๊ทธ๋๋ก ๊ณ ํต์ค๋ฝ์ต๋๋ค. ๋ ๊ณ ํต์ค๋ฝ๊ฒ ๋ง๋ค์ง ๋ง์๋ค.
๋๋ ์ฐ๋ฆฌ์ const fn ๊ฒ์ฌ๊ฐ const fn ๋ด๋ถ์์ ์ํ์ง ์๋ ๊ฒ์ ์ค์๋ก ํ์ฉ/์์ ํํ์ง ์์ ๋งํผ ์ถฉ๋ถํ ์๊ฒฉํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ด๊ฐ ํ๋ ธ๋ค๋ฉด ์ ์ ํด ์ฃผ์ธ์. ํ์ง๋ง ํด๋น ๊ฒ์ฌ๊ฐ ํ์ฌ const
rvalue ๋ณธ๋ฌธ์์ ํ์ฉ๋๋ ๊ฒ์ฌ์ ๋์ผํ์ง ์์ต๋๊น? ๋๋ const FOO: Type = { body };
์ const FOO: Type = foo(); const fn foo() -> Type { body }
๊ฐ ์์์ ๋ฐ๋๋ฅผ ํ์ฉํ๋ค๋ ์ ์์ ๋์ผํ๋ค๋ ์ธ์์ ๋ฐ์์ต๋๋ค.
@sgrif const fn
์๋ ์์ง๋ง const
์๋ ์๋ ์ธ์์ ๋ํ ์ฐ๋ ค๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ํ ์ฅ๊ธฐ์ ์ผ๋ก ์ค๋๋ ์ const fn
์์คํ
์ ์ ์งํ๋ ค๋ ๊ฒ์ธ์ง๋ ๋ช
ํํ์ง ์์ต๋๋ค.
๋์ const ์ ๋ค๋ฆญ(์๋ฐฉํฅ)์ ์ ์ํ๊ณ ์์ต๋๊น? (์: <const T>
+ const C<T>
๋๋ const C<const T>
?)
์ปดํ์ผ ํ์์ ๋ชจ๋ ํํ์์ ํ๊ฐํ๋ ค๊ณ ์๋ํ๊ณ ๊ฐ๋ฅํ์ง ์์ ๊ฒฝ์ฐ ํจ๋์ ์ผ์ผํค๋ try_const!
๋งคํฌ๋ก๋ฅผ ๊ฐ๊ณ ์ถ์ต๋๋ค. ์ด ๋งคํฌ๋ก๋ non-const fns๋ฅผ ํธ์ถํ ์ ์์ผ๋ฏ๋ก(miri ์ฌ์ฉ?) std์ ๋ชจ๋ ํจ์๊ฐ const fn์ผ๋ก ํ์๋ ๋๊น์ง ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์ธ์ ๋ ์ง ์คํจํ ์ ์์ผ๋ฏ๋ก ํจ์๊ฐ ์
๋ฐ์ดํธ๋๊ณ ์ด์ const๊ฐ ๋ ์ ์์ผ๋ฉด ์ปดํ์ผ์ด ์ค์ง๋ฉ๋๋ค.
@Badel2 ์ ๊ทธ๋ฐ ๊ธฐ๋ฅ์ ์ํ๋์ง ์ดํดํ์ง๋ง ๋๋ฆฌ ์ฌ์ฉํ๋ฉด ํฌ๋ ์ดํธ ์ํ๊ณ์ ์ ๋ง ๋์ ์ํฅ์ ๋ฏธ์น ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํฌ๋ ์ดํธ๊ฐ ์ปดํ์ผ ์๊ฐ์ ํ๊ฐ ๊ฐ๋ฅํ ๋ค๋ฅธ ํฌ๋ ์ดํธ์ ํจ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๊ณ ํฌ๋ ์ดํธ ์์ฑ์๊ฐ ํจ์ ์๋ช ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ปดํ์ผ ์๊ฐ์ ํ๊ฐ ๊ฐ๋ฅํ ํจ์๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ์ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํจ์๊ฐ ์ฒ์์ const fn
๋ก ํ์๋ ๊ฒฝ์ฐ ํฌ๋ ์ดํธ ์์ฑ์๋ ํฌ๋ ์ดํธ๋ฅผ ์ปดํ์ผํ๋ ค๊ณ ํ ๋ ์ง์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ ๊ฒ์ด๋ฉฐ ์ฃผ์์ ์์กดํ ์ ์์ต๋๋ค.
์ด๋์ฅ์์๋ง ์๋ํ๋ค๋ฉด... https://play.rust-lang.org/?gist=6c0a46ee8299e36202f959908e8189e6&version=stable
์ด๊ฒ์ ๋น๋๋ ํ๋ก๊ทธ๋จ์ ๋น๋ ์๊ฐ์ ํฌํจํ๋ ๋น ์ด์์ฑ(์ฌ์ค, ๋๋ฌด ๋น ์ด์์ฑ์ด์ด์ ๋ด ์์คํ ์์๋ ์๋ํ์ง๋ง ๋์ดํฐ์์๋ ์๋ํ์ง ์์ง๋ง ๋ ๋ค Linux์) ๋ฐฉ๋ฒ์ ๋๋ค.
์ด์ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ const ํ๊ฐ์์ SystemTime::now()๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๋๋ค.
( const fn
์ฌ๋ถ์ ๊ด๊ณ์์ด ๋ชจ๋ ํจ์/ํํ์์ const/compile-time-eval์ ๋ํ ์ธ์์
๋๋ค.)
๊ทธ๊ฒ์ include_bytes์์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ๊ธ์งํ๋ ์ฃผ์ฅ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค ๐
const fn์์ SystemTime::now๋ฅผ ํ์ฉํ๋ฉด ์์คํ
์ฑ๋ฅ, ์ค์ผ์ค๋ฌ ๋ฐ Jupiter์ ์์น์ ๋ฐ๋ผ const FOO: [u8; SystemTime::now()] = [42; SystemTime::now()];
์์ ๋ฌด์์๋ก ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ ๋์:
const TIME: SystemTime = SystemTime::now();
TIME์ ๊ฐ์ด ๋ชจ๋ ์ฌ์ฉ ์ฌ์ดํธ, ํนํ ์ฆ๋ถ ์ปดํ์ผ ๋ฐ ํฌ๋ ์ดํธ ์ ์ฒด์์ ๋์ผํ๋ค๋ ์๋ฏธ๋ ์๋๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ๋ฏธ์น ๊ฒ์ ๊ธธ์ด๊ฐ 3์ธ ๋ฐฐ์ด์์ ๋ณต์ impl์ ์ ํํ๊ฒ ๋ ์๋ ์์ง๋ง ๋ฐํ ์ ํ์ด ๊ธธ์ด๊ฐ 4์ธ ๋ฐฐ์ด์ผ ์ ์๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๋ถ๊ฑด์ ํ ๋ฐฉ์์ผ๋ก foo.clone()
๋ฅผ ๋ง์น ์ ์๋ค๋ ๊ฒ์
๋๋ค.
๋ฐ๋ผ์ ์์์ ํจ์๊ฐ ํธ์ถ๋๋๋ก ํ์ฉํ๋๋ผ๋ ์ง์ ํ ๋์ ์์ฑ๊ธฐ๋ฅผ ํ์ฉํ์ง ์๋ ๊ฒ์ฒ๋ผ SystemTime::new()๊ฐ ์ฑ๊ณต์ ์ผ๋ก ๋ฐํ๋๋๋ก ํ์ฉํ์ง ์์ต๋๋ค.
@SoniEx2 ์ฌ๊ธฐ์์๋ ๋ค์ ์ฃผ์ ๋ฅผ ๋ฒ์ด๋ ๊ฒ ๊ฐ์ง๋ง, ํ๋ฌผ build.rs
ํ์ผ์ ์ฌ์ฉํ์ฌ ์ค๋๋ ์ด๋ฏธ ์ด์ ๊ฐ์ ๊ฒ์ ๊ตฌํํ ์ ์์ต๋๋ค. Cargo Book์ Build Scripts , ํนํ ์ฝ๋ ์์ฑ ์ฌ๋ก ์ฐ๊ตฌ ์น์
์ ์ฐธ์กฐํ์ญ์์ค.
@oli-obk ํ๋๋ API ์์ ๋ฒ์ ๊ด๋ฆฌ์ ๊ดํ ๊ฒ์ด๊ณ ๋ค๋ฅธ ํ๋๋ ๋น๋ ํ๊ฒฝ์ ๊ดํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์ ํ ๋์ผํ ๋ฌธ์ ๋ ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์กฐ์ฌ์ค๋ฝ๊ฒ ์ ์ฉํ์ง ์์ผ๋ฉด ๋ ๋ค ์ํ๊ณ ํ์์ผ๋ก ์ด์ด์ง ์ ์๋ค๋ ์ ์๋ ๋์ํฉ๋๋ค.
const fn
์์ ํ์ฌ ์๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ํ์ฉํ์ง ๋ง์ญ์์ค . ๋น๋๋ฅผ ์ฌํํ ์ ์๋๋ก ๋ง๋๋ ๋ ๋ง์/๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ถ๊ฐํ ํ์๊ฐ ์์ต๋๋ค.
์ด๋ค ์ข
๋ฅ์ ๋น๊ฒฐ์ ๋ก (๋์, ํ์ฌ ์๊ฐ ๋ฑ)๋ const fn
์ ํ์ฉํ ์ ์์ต๋๋ค . ๊ทธ๋ฌ๋ฉด Rustc๋ ์์ ํํ์์ด ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ก ํ๊ฐ๋๋ค๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํ์ฉํ๋ฉด ์ ํ ์์คํ
์ด ๋ถ์ ์ ํฉ๋๋ค. ๋์ผํ ์
๋ ฅ. ์ข ๋ ์์ธํ ์ค๋ช
์ ์ฌ๊ธฐ ๋ฅผ ์ฐธ์กฐํ์ธ์.
https://github.com/rust-lang/rust/issues/24111#issuecomment -376352844์ ๊ฐ์ ์ฌ๋ก๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฏธ๋์ ๋ฐฉ๋ฒ์ ํ์ฌ ์๊ฐ์ ๊ฐ์ ธ์ ์ผ๋ฐ ์ซ์๋ก ๋ด๋ณด๋ด๋ ๊ฐ๋จํ ์ ์ฐจ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๋ฌธ์์ด ํ ํฐ. ์ ์ฐจ์ ๋งคํฌ๋ก๋ ๋น const Rust ์ฝ๋๊ฐ ์ฌ์ฉํ๋ ์ผ๋ฐ์ ์ธ ์ด์ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ผ๋ก ์๊ฐ์ ์ป์ ์ ์๋ ๊ฑฐ์ ์์ ํ ์ ํ๋์ง ์์ ์ฝ๋์ ๋๋ค.
@rfcbot fcp ๋ณํฉ
๋๋ ์ด๊ฒ์ ๋ณํฉํ ๊ฒ์ ์ ์ํฉ๋๋ค. ์๋ํ๋ฉด ์ด๊ฒ์ ๋ค์ ์ ์์ ์ธ ์ต์
์ด๊ณ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋๋ฉฐ ์ฐ๋ฐ์ ์ธ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐฉ์งํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ ๋ง ๋์ ์ ์ ๋ง์ ํจ์ ์ ์ธ ์์ const
๋ฅผ ๋์ ธ์ผ ํ๋ค๋ ๊ฒ์
๋๋ค.
@oli-obk ๋์ @rfcbot fcp merge - ์์ ํ์ ๋ํด ์๊ฐํ๊ณ ๋ฌธ์ ๋ฅผ ๋ ผ์ํ ๊ฐ์น๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํ์ @nrc ๊ฐ ์ด๋ฅผ ๋ณํฉํ ๊ฒ์ ์ ์ํ์ต๋๋ค. ๋ค์ ๋จ๊ณ๋ ํ๊ทธ๊ฐ ์ง์ ๋ ๋๋จธ์ง ํ์ด ๊ฒํ ํ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ ค ์ฌํญ:
๊ณผ๋ฐ์์ ๊ฒํ ์๊ฐ ์น์ธํ๊ณ ๋ฐ๋ํ์ง ์์ผ๋ฉด ์ต์ข ์๊ฒฌ ์ ์ถ ๊ธฐ๊ฐ์ด ์์๋ฉ๋๋ค. ์ด ํ๋ก์ธ์ค์ ์ด๋ ์์ ์์๋ ์ ๊ธฐ๋์ง ์์ ์ฃผ์ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ์๋ ค์ฃผ์ธ์!
ํ๊ทธ๊ฐ ์ง์ ๋ ํ ๊ตฌ์ฑ์์ด ๋์๊ฒ ์ค ์ ์๋ ๋ช ๋ น์ ๋ํ ์ ๋ณด๋ ์ด ๋ฌธ์ ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
@rfcbot ์ฐ๋ ค ์ฐ์ ์์
๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ค ๋์ง์ ๋ค๋ฃฐ ๋์ญํญ์ด ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ํ ์ดํ๊น์ง ์ด๊ฒ์ ํํธํ๊ณ ์ถ์ ์๋ ์์ต๋๋ค.
@rfcbot ์ ๋ชจ๋ ๊ฒ์ ์ผ๋ คํฉ๋๋ค-const
์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ const
๋ง๋ค ์ ์๋ ์ธ์ผํฐ๋ธ๊ฐ ์๋ ์ฝ๊ฐ์ C++ ์ธ๊ณ๋ก ๋๋ฉ๋๋ค.
@oli-obk์์ ์งง์ ํ ๋ก ์์ฝ:
๋ฏธ๋์๋ ๊ฑฐ์ ๋ชจ๋ ํจ์๊ฐ const
๋ก ํ์๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Vec
const
#$ ๊ฐ ๋ ์ ์์ต๋๋ค. ๊ทธ ์ธ๊ณ์์๋ const
ํค์๋๋ฅผ ์์ ํ ์ ๊ฑฐํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค. ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ด const
์ผ ์ ์์ผ๋ฉฐ ํจ์๋ฅผ const์์ non์ผ๋ก ๋ณ๊ฒฝํ๋ ค๋ฉด ์ต์ ์ ๋คํด์ผ ํฉ๋๋ค. -const, ๋ฐ๋ผ์ ์ถ๋ก ๋ constness์ ๋ํ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ ์ํ์ ๊ทธ๋ค์ง ๋์ง ์์ ๊ฒ์
๋๋ค.
๊ทธ๋ฌ๋ ์ค๋ const
์ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ค๋๋ ์ ๋ฏธ๋ฆฌ๋ ๋ชจ๋ ๊ฒ์ ํด์ํ ์ ์์ผ๋ฉฐ ํ๋ก๋์
๋จ๊ณ์์ ์์ ํ ํ
์คํธ๋์ง ์์์ต๋๋ค.
ํ์ฌ const
๋ฅผ ์๊ตฌํ๋ ๊ฒ์ ์ค์ ๋ก ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ฉฐ, ์ด ํค์๋๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์๊ณ ๋ฏธ๋์ ์ถ๋ก ๋ ์์๋ก ์ ํํฉ๋๋ค.
1, 2, 3์ ํจ๊ป ์ฌ์ฉํ๋ฉด ํฅํ ๋ฆด๋ฆฌ์ค์์ ์์ ํ๊ฐ ๊ฐ๋ฅํ ๊ธฐ๋ฅ ์งํฉ์ ํ์ฅํ๋ ๊ฒ๋ณด๋ค ํ์ฌ const
ํค์๋๋ฅผ ์์ ํํ๋ ๊ฒ์ด ์ข์ ์ต์
์ธ ๊ฒ ๊ฐ์ต๋๋ค. ์ผ๋ง ํ ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฒ์ ํ๊ฐํ ์ ์๋ ์ฒ ์ ํ๊ฒ ์ ํฌ ํ
์คํธ๋ฅผ ๊ฑฐ์น ํ๋ ์ค์๋ฆฌ ์์ ํ๊ฐ์๋ฅผ ๊ฐ๊ฒ ๋ ๊ฒ์
๋๋ค. ์ด ์์ ์์ ์ถ๋ก ๋ const๋ก ์ ํํ ์ ์์ต๋๋ค.
๋์ง ์ํ: const fn์ ์ผ๊ฐ, ํนํ ์๋ฒ ๋๋์์ ๋๋ฆฌ ์ฌ์ฉ๋์์ต๋๋ค. ๋ํ const fn ๊ฒ์ฌ๊ธฐ๋ ์ ์ ์ด๋์ ๋ผ์ด์ ๋ฐ ์์์ ์ฌ์ฉ๋๋ ๊ฒ์ฌ๊ธฐ์ ๋์ผํ ๊ฒ์ฌ๊ธฐ์ ๋๋ค(์ผ๋ถ ์ ์ ํน์ ๊ฒ์ฌ ๋ฐ ํจ์ ์ธ์ ์ ์ธ).
๋ด๊ฐ ๋ณด๋ ๊ฐ์ฅ ํฐ ๋จ์ ์ ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก const
๋ฅผ ์์ ์ ์ฒด์ ์์ ๋กญ๊ฒ ๋ฟ๋ฆฌ๋ ๊ฒ์ ์นํธํ๊ณ ์๋ค๋ ๊ฒ์
๋๋ค(์ง๊ธ์ ๋ฏธ๋ ์์ด๋์ด์ ๋ํ @matklad ์ ๊ฒ์๋ฌผ ์ฐธ์กฐ
@rfcbot ์ parallel-const-traits์ ๋ํด ๊ฑฑ์ ํฉ๋๋ค.
์ด๊ฒ์ ์์ ํํ๋ฉด Const
๊ฐ ์์ ์๋ ๋ณ๋ ฌ ํน์ฑ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ง๋๋ ๋ง์ ์์๊ฐ ์ฆ์ ์์ฑ๋๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ConstDefault
, ConstFrom
, ConstInto
, ConstClone
, ConstTryFrom
, ConstTryInto
๋ฑ ConstIndex
๋ฑ์ ์๊ตฌํฉ๋๋ค. ๊ทธ๋ ๊ฒ ๋์ฐํ์ง๋ ์์ต๋๋ค. ์ค๋๋ Try
๋ก ์ฝ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ง๋ง TryFrom์ ์์ ํํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์
๋๋ค. (https://github.com/rust-lang/rfcs/pull/2237์
๋๊น? ๋ชจ๋ฅด๊ฒ ์ต๋๋ค).
( @nrc : ๋ด์ด ๊ทํ์ ๊ด์ฌ์ฌ ์ค ํ๋๋ง ๋ฑ๋กํ ๊ฒ ๊ฐ์ต๋๋ค)
Parallel-const-traits๋ ๊ฐ์์ ๋ฏธ๋ const-all-the-things ๋ฒ์ ์์ ๊ฐ๋จํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ค์ ๊ทธ๋ฅ ์ผํ ๊ฒ์ ๋๋ค.
const fn ์ธ๊ณ์์ ์ฐ๋ฆฌ๊ฐ const fn ํน์ฑ ๋ฉ์๋(์ฐ๋ฆฌ๋ atmํ์ง ์์)๋ฅผ ํ์ฉํ์ง ์๋ ํ ํน์ฑ ๋ณต์ ๋ก ๋๋์ง ์์ ๊ฒ์ ๋๋ค. ๋ฌผ๋ก 1๋ ์ libstd๊ฐ ์์๋ ์ํฉ๊ณผ ์ ์ฌํ ๊ด๋ จ ์์(์ผ๊ฐ)๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ๊ฐ์ธ ํ๋๋ฅผ ๋ ธ์ถํ์ง ์๊ณ statics/constants ๋ด๋ถ์ ๋ค์ํ ์ ํ์ ์ด๊ธฐํํ๊ธฐ ์ํ ๋ง์ ์์๋ฅผ ๊ฐ์ง๊ณ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ด๋ฏธ ํ๋์ ์ผ์ด๋ ์ ์์๊ณ ์ผ์ด๋์ง ์์ ์ผ์ ๋๋ค.
๋ถ๋ช
ํ ํ์๋ฉด $#$ const fn
#$ ๊ฐ ์์ด๋ ํ์ฌ ConstDefault
๊ฐ ๊ฐ๋ฅํ๋ฉฐ ๋๋จธ์ง ์์ ( ConstFrom
, ConstInto
, ConstClone
, ConstTryFrom
, ConstTryInto
) ์ด ๊ธฐ๋ฅ์ด ์์ ํ๋ ์ํ์์๋ @oli-obk๊ฐ ์ธ๊ธํ ๋๋ก const ํน์ฑ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
( ConstDefault
๋ ์ฐ๊ฒฐ๋ const fn ๋์ ์ฐ๊ฒฐ๋ const ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฅํ์ง๋ง ๋ด๊ฐ ์๋ ํ ์ ๋ ฅ์ ๋์ผํฉ๋๋ค.)
@scottmcm const fn
ํน์ฑ ์ ์๋ ์ค๋๋ ๋ถ๊ฐ๋ฅํฉ๋๋ค(์ค @solson ์ด ์ด๋ฏธ ์ธ๊ธํ์ต๋๋ค).
@eddyb ์์์ ์์ด๋์ด: ํน์ฑ ์ ์์ const fn
๋ฅผ ์ถ๊ฐํ๋ ๋์ const impl
ํน์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? (์ด ๋์ ์ํธ ๋ฐฐํ์ ์ด์ง ์์ต๋๋ค.)
@whitequark https://github.com/rust-lang/rfcs/pull/2237 ์ ๊ฐ fn
์์ const impl
๋ฅผ const fn
๋ก ํ์ฅํ๋ ์กฐํฉ์ ํตํด ๊ทธ ์์ด๋์ด๋ฅผ ๋ค๋ฃน๋๋ค. impl
, const
์ ์ด๋ค ๋ฉ์๋๋ ํ์ํ์ง ์๊ณ T: const Trait
๊ฒฝ๊ณ๋ฅผ ์ถฉ์กฑํ๊ธฐ ์ํด ๋ชจ๋ const
๋ฉ์๋์ ํจ๊ป impl
ํ์ฉ ํน์ฑ ์ ์ ์์ฒด.
@rfcbot ์ฐ๋ ค ๋์์ธ
์ฐ๋ฆฌ๋ ์ญ์ฌ์ ์ผ๋ก ๋ช ๊ฐ์ง ์ด์ ๋ก ํน์ const fn
์์คํ
์ ์์ ํํ๊ธฐ ์ํด ๋
ธ๋ ฅํ์ต๋๋ค.
const fn
trait
const fn
๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ $ impl
๋ฅผ ์ง์ํ์ง ์์ต๋๋ค(https://github.conf ์ฐธ์กฐ). com/rust-lang/rfcs/pull/2237์ ์ํํ๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ)T: Trait
๋ฐ์ธ๋ฉ๋ const fn
๋ฅผ ํตํด ์ฌ์ฉ๋๋ ๋ฉ์๋๋ฅผ ๋ณ๋์ ํน์ฑ ์์ด , ๊ฐ๊ธ์ ์ด๋ฉด ์ปดํ์ผ ํ์์ ์ฌ์ฉํ ๋๋ง (์: Option::map
) ์์ฒญํ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. const fn
๋ฅผ ์ฌ์ฉํ๋ ์ ์ฒด ์์๊ฐ ์์ ์ ์์ต๋๋ค( libcore
๊ฐ ๋ง์์ ์ด)์ด๋ฌํ ๋ฌธ์ ์ ๋๋ถ๋ถ ๋๋ ๋๋ถ๋ถ์ ์ํํ ์ ์๋ ๋ค์ํ ๋์์ธ ์ ํ์ด ์์ต๋๋ค(๋ค๋ฅธ ๊ฒ์ ๋์ ํ๋ ๋น์ฉ์ผ๋ก). ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง๊ฐ ์์ต๋๋ค.
const fn
์ธก๋ฉด์์) ๋งคํฌ๋ก์ฒ๋ผ ์๋ํฉ๋๋ค.์ด๋ ๊ฒ ํ๋ฉด ํฌ๋ ์ดํธ๊ฐ ์ปดํ์ผ ์๊ฐ์ ํ๊ฐ ๊ฐ๋ฅํ ๋ค๋ฅธ ํฌ๋ ์ดํธ์ ํจ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๊ณ ํฌ๋ ์ดํธ ์์ฑ์๊ฐ ํจ์ ์๋ช ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ปดํ์ผ ์๊ฐ์ ํ๊ฐ ๊ฐ๋ฅํ ํจ์๋ฅผ ๋ฐฉ์งํ๋ ๊ฒ์ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
@leoschwarz ์ด๊ฒ์ ์ด๋ฏธ ์๋ ํน์ฑ์ ๋ฌธ์ ๊ฐ ์๋๋๊น? ์๋ง๋ ์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ Rust-semverver๋ฅผ ํ๋ฌผ๊ณผ ํตํฉํ์ฌ ์ด๋ฌํ ์ข ๋ฅ์ ์๋ํ์ง ์์ ํ์์ ๊ฐ์งํ๋ ๊ฒ์ ๋๋ค.
์ฆ, miri์ (๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๋ก์) ์ค์๋ก ์ด๊ณผํ๋ ํ๊ฐ ์๊ฐ ์ ํ์ด ์์ด ์ปดํ์ผ ์คํจ ๋ค์ด์คํธ๋ฆผ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๋๋์ง ๋ช ํํ์ง ์์ต๋๋ค.
@nrc "everything-const"๊ฐ ์ฌ์ค์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ๋ฌธ์ ๋ ์๋๋๋ค. ์, ์ฐ๋ฆฌ๋ const
๋ง์ ๊ฒ์ ํ์ํ๊ฒ ๋ ๊ฒ์
๋๋ค.
๋ชจ๋ ๊ฒ์ด ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ก ๋๊ธฐ๋ฅผ ์ํ๋์ง ํ์ ์ด ์์ง ์๋๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค.
์์ ๋ฐํ์ ๋๋ ์ปดํ์ผ ์๊ฐ์ด ๋ ๊ธด์ง์ ๋ํ ๊ฒฐ์ ์
๋๋ค.
์ค์ํ. ๋๋ก๋ ์ปดํ์ผ๋ฌ๊ฐ ๋ค์์์ ์ถฉ๋ถํ ๊ณ์ฐ์ ์ํํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ปดํ์ผ ์๊ฐ!
2018๋
3์ 28์ผ ์์์ผ ์คํ 2:49, Josh Triplett [email protected]
์ผ๋ค:
@nrc https://github.com/nrc "everything-const"๊ฐ ์ฌ์ค์ด๋ผ๊ณ ์๊ฐํ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค.
์ด์. ์, ์ฐ๋ฆฌ๋ const์ ๊ฑฐ๋ํ ๋ฒ์๋ฅผ ํ์ํ๊ฒ ๋ ๊ฒ์ ๋๋ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/24111#issuecomment-376914220 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAC3ny9Wm9JK6p-fXf6gbaEgjFtBpMctks5ti6LigaJpZM4D66IA
.
ํ๊ฐ ์๊ฐ ์ ํ
๊ทธ ํ๊ณ๋ ๊ณง ์ฌ๋ผ์ง๋ค.
๋ชจ๋ ๊ฒ์ด const๋ก ์ ์ถ๋๊ธฐ๋ฅผ ์ํ๋์ง ํ์ ์ด ์์ง ์๋๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ์ต๋๋ค.
์๋จ, ์ปดํ์ผ ํ์์ ๋ฌด์์๋ก ๊ณ์ฐํ์ง ์์ ๊ฒ์ ๋๋ค. ์ ์ , ์์, ์ด๊ฑฐํ ๋ณ์ด ํ๋ณ์ ๋ฐ ๋ฐฐ์ด ๊ธธ์ด์ ๋ณธ๋ฌธ์์ ์์์ ๊ฒ์ ๊ณ์ฐํ๋๋ก ํ์ฉํ์ญ์์ค.
@rfcbot ์ด ๋ณ๋ ฌ ์์ ํน์ฑ์ ํด๊ฒฐํ์ต๋๋ค.
์์ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๊ทธ ํ๊ณ๋ ๊ณง ์ฌ๋ผ์ง๋ค.
์์ฒญ๋. ์ด ๊ฒฝ์ฐ auto-const-fn(rust-semverver์ ์ผ๋ถ ํตํฉ ๋๋ ํ์์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์ ์ฌ ๊ธฐ๋ฅ๊ณผ ํจ๊ป)์ด ํ๋ฅญํ๊ฒ ๋ค๋ฆฌ์ง๋ง "๋ก๊น ์ถ๊ฐ ๋ฐ ํ์ ์์ธ"์ ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ๋ฒ์ ๋ฒํธ๋ฅผ ์ฌ๋ฆด ์๋ ์์ง๋ง ์ ํํ์ง๋ ์์ต๋๋ค.
๋ก๊น ๋ฐ ์ธ์๋ ์์ ๋ชจ๋ธ์์ "์ ์์ ์ธ" ๋ถ์์ฉ์ ๋๋ค. ๋ชจ๋๊ฐ ๋์ํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์ ์ ์์ ๊ฒ์ ๋๋ค. ํ์ผ์ ์ธ ์๋ ์์ต๋๋ค(์ค์ ๋ก๋ ์๋์ง๋ง ๋ง์น ์ฐ๋ฆฌ๊ฐ ํ ๊ฒ์ฒ๋ผ ํ๋ํ๊ณ ๋ชจ๋ ๊ฒ์ ๋ฒ๋ฆฝ๋๋ค).
๋ถ์์ฉ์ ๋ง์์ด ๋ฒ๋ฆฌ๋ ๊ฒ์ด ์ ๋ง ๊ฑฑ์ ์ ๋๋ค.
RFC๋ฅผ ์์ฑํ๋ฉด ์ด์ ๋ํด ๋ ผ์ํ ์ ์์ต๋๋ค. ์ง๊ธ์ ์์์ "๋ถ์์ฉ"์ด ์์ ์ ์์ต๋๋ค. ์ฃผ์ ๋ const fn ์์ ํ์ ์ง๊ตํฉ๋๋ค.
๋๋ ์ ์ถ์ ๋ํ "๊ทธ๋ฅ semver ๊ฒฝ๊ณ ๋ฅผ ์ํํ์ญ์์ค"์ ๊ทผ ๋ฐฉ์์ ๋ํด ์ฝ๊ฐ ๊ฑฑ์ ํฉ๋๋ค.
์ผ๊ด์ฑ. constness์ ๋ํด ์๊ฐํด ๋ณธ ์ ์ด ์๋ ํฌ๋ ์ดํธ ์์ฑ์๊ฐ ๋ณธ๋ค๋ฉด
"๊ฒฝ๊ณ : ๋ฐฉ๊ธ ๋ณ๊ฒฝํ ์ฌํญ์ผ๋ก ์ธํด foo()๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
์ด์ ์๋ ๊ฐ๋ฅํ๋ const ์ปจํ
์คํธ"๋ฅผ ์ฌ์ฉํ๋ฉด
non-sequitur ๋ฐ ์นจ๋ฌต? ๋ถ๋ช
ํ, ์ด ๋ฌธ์ ์ ์ฌ๋๋ค์ ์์ฃผ ์๊ฐํฉ๋๋ค.
์ด๋ค ํจ์๊ฐ const๊ฐ ๋ ์ ์๋์ง์ ๋ํด. ๊ทธ๋ฆฌ๊ณ ๋ ๋ง์ ์ฌ๋๋ค์ด ํด์ฃผ๋ฉด ์ข์ํ
๋ฐ
(์ผ๋จ const_fn์ด ์์ ๋๋ฉด). ๊ทธ๋ฌ๋ ์์ธ์ ๊ฒฝ๊ณ ๊ฐ ๋ง์ต๋๋ค.
๊ทธ๊ฒ์ ๊ฒฉ๋ คํ๋ ๋ฐฉ๋ฒ?
2018๋
3์ 29์ผ ๋ชฉ์์ผ ์ค์ 4์ 36๋ถ, Oliver Schneider [email protected]
์ผ๋ค:
RFC๋ฅผ ์์ฑํ๋ฉด ์ด์ ๋ํด ๋ ผ์ํ ์ ์์ต๋๋ค. ์ง๊ธ์ ๊ทธ๋ฅ
์์์ "๋ถ์์ฉ"์ด ์์ ์ ์์ต๋๋ค. ์ฃผ์ ๋ ์ง๊ต
์์ ํ const fnโ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/24111#issuecomment-377164275 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAC3n3MtmvrDF42Iy0nhZ2q8xC-QGcvXks5tjJ0ggaJpZM4D66IA
.
๋ช ์์ const fn์ ๋ง์ API๋ฅผ ์ฑ๊ฐ์๊ฒ ํ๊ณ ํผ๋์ค๋ฝ๊ฒ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ์์์ ์ผ๋ก ๊ฐ์ ํ๋ ๋์ ์คํํ๊ธฐ์๋ ๋๋ฌด ๋ง์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋๊ตฐ๊ฐ๊ฐ ํ ๋ฒ๋ง ๋ณ๊ฒฝํด๋ ์ค์๋ก ๋ง์ ์ฝ๋๋ฅผ ์์์ฑ์ง ๋ชปํ ์ฑ ์ค์๋ก ๊นจ๋จ๋ฆด ์ ์๋ค๋ ์ ์ ๋ช ์ํ์ง ์๋ ๊ฒ์ด ๊ฐ์ฅ ํฐ ๋ฌธ์ ์ ๋๋ค. ์ด๊ฒ์ ํนํ Rust ์ํ๊ณ์์ ํํ ๋ณผ ์ ์๋ ๊ธด ์ข ์์ฑ ๊ทธ๋ํ์ ๊ด๋ จ์ด ์์ต๋๋ค. ํจ์ ์๋ช ์ ๋ํ ๋ช ์์ ์ธ ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒฝ์ฐ ์ด๊ฒ์ด ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์์ ๋ ์ฝ๊ฒ ์ ์ ์์ต๋๋ค.
์๋ง๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ #![infer_const_fn]
๋๋ ์ด์ ์ ์ฌํ ์์์ ๋ฃจํธ์ ์ถ๊ฐํ ์ ์๋ ์์ ์์ค ๊ตฌ์ฑ ํ๋๊ทธ๋ก ๊ตฌํ๋ ์ ์์ผ๋ฉฐ ์์ํ ์ตํธ์ธ ์ํ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค. ํ๋๊ทธ๊ฐ ์ถ๊ฐ๋๋ฉด const fn์ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ํฌ๋ ์ดํธ์์ ์ถ๋ก ๋๊ณ ๋ฌธ์์๋ ๋ฐ์๋ฉ๋๋ค(๊ทธ๋ฆฌ๊ณ ํธ์ถ๋ ํจ์๋ const fn์ด ๋์ด์ผ ํจ). ํฌ๋ ์ดํธ ์์ฑ์๊ฐ ์ด ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ฉด ์ผ์ข
์ ์ ์ค์ ๊ธฐํ๊ฒ ๋ค๋ ์ฝ์ ๋ฒ์ ๊ด๋ฆฌ์ ๋ํด ๊ทธ๋ฆฌ๊ณ ์๋ง๋ rust-semverver๊ฐ ๊ฐ์ ๋ ์๋ ์์ต๋๋ค.
๊ฑฐ๊พธ๋ก ํด๋ณด๋ฉด ์ด๋จ๊น์?
const fn ๋์ side fn์ ์ฌ์ฉํ์ญ์์ค.
๊ทธ๊ฒ์ ์ฌ์ ํ โโโโ๋ช ์์ ์ด๋ฉฐ (๋ช ์์ ์ผ๋ก ํธํ์ฑ์ ๊นจ๊ณ ์ธก๋ฉด fn์ ํธ์ถํ๋ ค๋ฉด ์ธก๋ฉด fn์ ๋ฃ์ด์ผ ํจ) ํผ๋์ ์ ๊ฑฐํฉ๋๋ค. (์ผ๋ถ) ๋ด์ฅ ๋ฐ asm์ด ์๋ ๋ชจ๋ ๊ฒ์ fn์ด ๋ ๊ฒ์ ๋๋ค.
์ด์ ๋ฒ์ ๊ณผ ํธํ๋์ง๋ ์์ง๋ง ์๋์ ์ ์ถ๊ฐํ ์ ์์๊น์?
2018๋ 3์ 30์ผ ์ค์ 2:43:06 GMT+08:00, "Soni L." [email protected] ์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๊ฑฐ๊พธ๋ก ํด๋ณด๋ฉด ์ด๋จ๊น์?
const fn ๋์ side fn์ ์ฌ์ฉํ์ญ์์ค.
์ฌ์ ํ ๋ช ์์ ์ ๋๋ค(side fn์ ํธ์ถํ๋ ค๋ฉด side fn์ ๋ฃ์ด์ผ ํฉ๋๋ค.
๋ช ์์ ์ผ๋ก ํธํ์ฑ์ ๊นจ๊ณ ), ํผ๋์ ์ ๊ฑฐํฉ๋๋ค. (์ผ๋ถ)
๋ด์ฅ ๋ฐ asm์ด ์๋ ๋ชจ๋ ๊ฒ์ fn์ด ๋ฉ๋๋ค.--
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/24111#issuecomment -377333542
--
K-9 Mail์ ์ฌ์ฉํ์ฌ Android ๊ธฐ๊ธฐ์์ ๋ณด๋์ต๋๋ค. ์ ๊ฐ๋ตํ ์ค๋ช
์ ๋ถํ๋๋ฆฝ๋๋ค.
๋ ํฐ ๋ฌธ์ ๋ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ํ๋ ๊ฒ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ด๋ณด์์๊ฒ ํฐ ์ถฉ๊ฒฉ์ ์ค ๊ฒ์ด๋ผ๋ ๊ฒ์ ๋๋ค.
@whitequark ๋๋ ๋จ์ง ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ("๋ถ์์ฉ ์์ ๊ธฐ")์ ๋์ํ์ง ์์ต๋๋ค. @oli-obk๊ฐ ๋ฏธ๋์ ํ์ฅ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ์์๋ ํ ๋ก ์์ ๋๋ ๋ค์์ ์๊ณ ์์ต๋๋ค.
ํธ์ง : ํ ๋ก ์ด ํ์ ํ์ง ์๋๋ก, ์:
๋ถ์์ฉ์ ๋ฒ๋ฆฌ๋ฉด const ๋๋ non const๋ผ๊ณ ํ๋ ๊ฒฝ์ฐ ์ฝ๋๊ฐ ๋ค๋ฅด๊ฒ ๋์(์: ํ์ผ์ ์์ฑํ ๋ค์ ์ฝ๊ธฐ)ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ (์๋ง๋?) ๋ชจ๋ @oli-obk๊ฐ ๊ทธ๋ฐ ๋ถ์์ฉ์ ๋ฒ๋ฆฌ๋ ๊ฒ์ ๊ดํด ์๋ชป ์ด์ผ๊ธฐํ๋ค๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ์ ํฌ๋ ์ดํธ ๋ฃจํธ์ ์ถ๊ฐํ ์ ์๋ ํฌ๋ ์ดํธ ์์ค ๊ตฌ์ฑ ํ๋๊ทธ๋ก ๊ตฌํ๋ ์ ์์ต๋๋ค.
์ด๋ https://github.com/rust-lang/rust/issues/24111#issuecomment -376829588์์ ์ด์ ์ ์์ ๋ ๋ฒ์งธ ์์ ํ์ ์งํฉ ์
๋๋ค.
๋ฒ์๊ฐ ์ง์ ๋ "๊ตฌ์ฑ ํ๋๊ทธ"๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ์๋ ๋ณด๋ค ์ธ๋ถํ๋ ๋ฒ์ IMO๋ฅผ ์ ํํ ์ ์์ด์ผ ํฉ๋๋ค.
๊ฑฐ๊พธ๋ก ํด๋ณด๋ฉด ์ด๋จ๊น์?
const fn ๋์ side fn์ ์ฌ์ฉํ์ญ์์ค.
๊ทธ๊ฒ์ ์ฌ์ ํ โโโโ๋ช ์์ ์ด๋ฉฐ (๋ช ์์ ์ผ๋ก ํธํ์ฑ์ ๊นจ๊ณ ์ธก๋ฉด fn์ ํธ์ถํ๋ ค๋ฉด ์ธก๋ฉด fn์ ๋ฃ์ด์ผ ํจ) ํผ๋์ ์ ๊ฑฐํฉ๋๋ค. (์ผ๋ถ) ๋ด์ฅ ๋ฐ asm์ด ์๋ ๋ชจ๋ ๊ฒ์ fn์ด ๋ ๊ฒ์ ๋๋ค.
https://github.com/rust-lang/rust/issues/24111#issuecomment -376829588์์ ์ ๋ ์ ์ฒด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ "all const fn
" ๋๋ "all side fn
์ ์์์ ์ง์ ํ๋ ค๊ณ ํ์ต๋๋ค. ".
ํจ์ ์ ์ธ์ด ์๋๋ผ ๋ฒ์๊ฐ ์ง์ ๋ ๊ฒฝ์ฐ ํฅํ ๋ฒ์ ์์ ์๋ํ ์ ์์ต๋๋ค .
๊ทธ๋ฌ๋ "๋ณธ๋ฌธ์์ ์ถ๋ก " ์๋งจํฑ์ด ์์ผ๋ฉด ์ตํธ์ธ side fn
์ ๋ํด์๋ ํน์ฑ ์ํธ์์ฉ์ ์ค๊ณํด์ผ ํ๋ฏ๋ก ์๋ฌด ๊ฒ๋ ์ป์ง ๋ชปํ๊ณ ์ ์ฌ์ ์ผ๋ก ์์ฒญ๋ ๋ง์ฐฐ์ ์ผ์ผํฌ ์ ์์ต๋๋ค.
Kenton Varda์ "์ ํดํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ ์ฑ๊ธํค" ๊ธ์ ์น์ 3.3์ด ์ฌ๊ธฐ์ ๊ด๋ จ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค(์์งํ ์ ์ฒด ๋ด์ฉ์ ์ฝ์ ๊ฐ์น๊ฐ ์์ต๋๋ค).
๋๋ฒ๊ทธ ๋ก๊น ์ ์ด๋ป์ต๋๊น?
์ค์ ๋ก ๋ชจ๋ ์ฌ๋์ ๋๋ฒ๊ทธ ๋ก๊น ์ด ์ฝ๋์ ๋ชจ๋ ๋ถ๋ถ์์ ์ฌ์ฉ ๊ฐ๋ฅํด์ผ ํจ์ ์ธ์ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋ํด ์์ธ๋ฅผ ๋ง๋ญ๋๋ค. ์ด ์์ธ์ ๋ํ ์ ํํ ์ด๋ก ์ ๊ทผ๊ฑฐ๋ ๊ด์ฌ ์๋ ์ฌ๋๋ค์ ์ํด ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ณต๋ ์ ์์ต๋๋ค.
๋ณด์ ๊ด์ ์์ ๋๋ฒ๊ทธ ๋ก๊น ์ ์์ฑ ๋จ์ผ ํญ๋ชฉ์ ๋๋ค. ์ฐ๊ธฐ ์ ์ฉ์ด๋ฏ๋ก ํต์ ์ฑ๋๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋ฒ๊ทธ ๋ก๊น ์ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊ฒฐ์ ์ง๋ ์์๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊ทธ ๋ก๊ทธ์ ๊ธฐ๋กํจ์ผ๋ก์จ ์ด๋ค ์ข ๋ฅ์ ์์๋ ์ผ์ผํค๋ ๊ฒ์ ๋ถ๋ช ํ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ ์ฑ ๋ชจ๋์ด ๋ก๊ทธ๋ฅผ "์คํธ"ํ๋๋ผ๋ ๋๋ฒ๊ทธ ๋ก๊ทธ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ ๋ฉ์์ง๋ฅผ ์์ฑํ ๋ชจ๋์ ์ ํํ ์๋ณํ๊ธฐ ๋๋ฌธ์ ํด๋น ๋ชจ๋์ ๋ฉ์์ง๋ฅผ ์ฝ๊ฒ ํํฐ๋งํ ์ ์์ต๋๋ค(๋๋ก๋ ์คํ ์ถ์ ์ ์ ๊ณตํ๊ธฐ๋ ํจ). ๋ฐ๋ผ์ ์ ๊ณตํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋๋ฒ๊ทธ ๋ก๊น ์ด ๊ฐ๋ ์ฑ, ํ ์คํธ ๊ฐ๋ฅ์ฑ ๋๋ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅ์ฑ์ ํด๋ฅผ ๋ผ์น์ง ์๋๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ ์ฌํ ์ฃผ์ฅ์ ํ ์ ์์ต๋๋ค.
๋๋ฒ๊ทธ ๋ก๊น ์ ๋ํ ๋ ๋ค๋ฅธ ์ด๋ก ์ ์ ๋นํ๋ ๋๋ฒ๊ทธ ๋ก๊ทธ ๊ธฐ๋ฅ์ด ์ค์ ๋ก๋ ๋๋ฒ๊ฑฐ์์ ๊ด์ฐฐ๋๋ ๋ฌด์๋์ด๋ผ๋ ๊ฒ์ ๋๋ค. ๋๋ฒ๊ฑฐ๊ฐ ์คํ๋๊ณ ์์ง ์์ผ๋ฉด ํจ์๋ ์๋ฌด ์์ ๋ ์ํํ์ง ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋๋ฒ๊น ์ ๋ถ๋ช ํ ์ ์ฒด ๊ฐ์ฒด ๊ธฐ๋ฅ ๋ชจ๋ธ์ ๊นจ๋จ๋ฆฌ์ง๋ง ๋ถ๋ช ํ ๊ถํ ์๋ ์์ ์ด๊ธฐ๋ ํฉ๋๋ค.
"[๋๋ฒ๊น ์ ์ํ] ์๋ฃจ์ ์ ์์๋ผ ์ ์์ต๋๋ค"์ ๋ํ ๋ด ์ง์ ์ ์ค์ ๋ก const์์ ํธ์ถํ ์ ์์ง๋ง ์ธ์ ํ์์ด ์๋ ์ ์ฌ์ ์ธ ๋ฏธ๋ API๋ฅผ ์ธ๊ธํ ๊ฒ์ ๋๋ค. ํ๋ซํผ๋ณ ์ธ์ ์์ ์ ๋ฌด์์๋ก ๊ตฌํํ๋ ๊ฒ์(์ธ์/๋๋ฒ๊ทธ ๋ช ๋ น๋ฌธ์ด ์๋ ๊ธฐ์กด ์ฝ๋๋ฅผ const๋ก ๋ง๋ค ์ ์๋๋ก) const ํ๊ฐ์๊ฐ ์ํํด์ผ ํ๋ ์์ ์ด ์๋๋๋ค. ์ด๊ฒ์ ์์ ํ ์ตํธ์ธ์ด๋ฉฐ ๋ค๋ฅธ ๊ด์ฐฐ ๊ฐ๋ฅํ ๋์(์: ๋ฐํ์ ์ const eval ๋ฐ ๋ช ๋ น์ค/ํ์ผ ์ถ๋ ฅ์ ๊ฒฝ๊ณ )์ ๋ช ์์ ์ผ๋ก ๊ฐ์ง ์์ต๋๋ค. ์ ํํ ์๋ฏธ๋ ๋ฏธ๋์ RFC์ ๋จ๊ฒจ์ง๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก const fn๊ณผ ์์ ํ ์ง๊ตํ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋์ด์ผ ํฉ๋๋ค.
const impl Trait
๋ฐ T: const Trait
์ ์ค๋ํ ๋จ์ ์ด ์์ต๋๊น?
const
์ฃผ์์ ์คํ๋ ์ด๋ฅผ ๋ ๋ง์ด ๋ฟ๋ฆฌ๋ ๊ฒ ์ธ์ ์ผ๋ถ ํน์ฑ ๋ฉ์๋๋ง const์ผ ์ ์์ผ๋ฉฐ ๋ ์ธ๋ฐํ ์ ์ด๊ฐ ํ์ํฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ง์ ํ๋ ๊น๋ํ ๊ตฌ๋ฌธ์ ๋ชจ๋ฆ
๋๋ค. ์๋ง๋ where <T as Trait>::some_method is const
( is
์ ๋ฌธ๋งฅ ํค์๋์ผ ์ ์์).
๋ค์ ๋งํ์ง๋ง, const fn๊ณผ ์ง๊ตํฉ๋๋ค.
[u8; SizeOf<T>::Output]
const์ side fns๊ฐ ๋ถ๋ฆฌ๋ ๊ฒฝ์ฐ ์ค์ ์ค๊ณ ๊ณ ๋ ค ์ฌํญ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๊ทธ๊ฒ๋ค์ ๋ถ๋ฆฌํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ const fns๋ฅผ ์ค๋๋ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ํ๋ง ์์ ์ ํ ์์คํ ์ ํ์ฅ์ผ๋ก ๋ง๋๋ ๊ฒ์ ๋๋ค.
๋๋ const fns๋ฅผ ์ค์ ๋ก const๋ก ๋ง๋ญ๋๋ค. ๋ชจ๋ const fn์ ๋ชจ๋ ๋งค๊ฐ๋ณ์๊ฐ const ์ ๋ค๋ฆญ์ธ ๊ฒ์ฒ๋ผ ํ๊ฐ๋์ด์ผ ํฉ๋๋ค.
์ด๊ฒ์ ๊ทธ๋ค์ด ํ์ฌ ์ ์๋ const fns์ ๋ํด ๊ฐ์ธ์ ์ผ๋ก ์ถ๋ก ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ถ๋ก ํ๊ธฐ๊ฐ ํจ์ฌ ๋ ์ฝ์ต๋๋ค. ํ๋ง ์์ ์ ํ, ๋งคํฌ๋ก, ์ผ๋ฐ fns ๋ฑ์ ๋ํด ์ถ๋ก ํ ์ ์์ง๋ง ์ฌ์ํ ์ธ๋ถ ์ฌํญ์ด๋ผ๋ ์๋ฏธ๋ฅผ ์์ ํ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ const fn์ ๋ํด ์ถ๋ก ํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์์์ต๋๋ค.
์ฌ์ํ ์ธ๋ถ ์ฌํญ์กฐ์ฐจ๋ ์๋ฏธ๋ฅผ ์์ ํ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์์ธํ ์ค๋ช
ํด ์ฃผ์๊ฒ ์ต๋๊น? const fn
ํฌ์ธํฐ, const
ํน์ฑ ๊ฒฝ๊ณ์ ๊ฐ์ ํ์ฅ์ ์๋ฏธํฉ๋๊น? const fn
์ ์์์์ ์ฌ์ํ ์ธ๋ถ ์ฌํญ์ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋๋ const fns๋ฅผ ์ค์ ๋ก const๋ก ๋ง๋ญ๋๋ค. ๋ชจ๋ const fn์ ๋ชจ๋ ๋งค๊ฐ๋ณ์๊ฐ const ์ ๋ค๋ฆญ์ธ ๊ฒ์ฒ๋ผ ํ๊ฐ๋์ด์ผ ํฉ๋๋ค.
๊ทธ๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ปดํ์ผ ํ์์ ํ๋ ์ผ์ ๋๋ค. ๋ฐํ์์ ํจ์๋ ๋ค๋ฅธ ํจ์์ฒ๋ผ ์ฌ์ฉ๋ฉ๋๋ค.
๋ฌธ์ ๋ ์ฌ์ํ ์ธ๋ถ ์ฌํญ์ด const eval์ ๋ฐํ์ eval๋ก ๋ฐ๊ฟ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ฒ์์๋ ํฐ ๊ฑฐ๋์ฒ๋ผ ๋ณด์ด์ง ์์ ์ ์์ง๋ง, ๊ทธ๋ด ์ ์์ต๋๋ค .
ํจ์ ํธ์ถ์ด ๋ชจ๋ const fns์ด๊ธฐ ๋๋ฌธ์ ์ ๋ง ๊ธธ๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ฌ๋ฌ ์ค๋ก ๋๋๊ณ ์ถ์ต๋๋ค.
๋ฐ๋ผ์ let
๋ช ๊ฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์ด์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๋ฐ 20๋ฐฐ ๋ ์ค๋ ๊ฑธ๋ฆฝ๋๋ค.
@SoniEx2 ๋ฐฐ์ด์ ํฌ๊ธฐ( $N
in [u8; $N]
)๋ ํญ์ ์ปดํ์ผ ํ์์ ํ๊ฐ๋ฉ๋๋ค. ํด๋น ํํ์์ด const
๊ฐ ์๋๋ฉด ์ปดํ์ผ์ด ์คํจํฉ๋๋ค. ๋ฐ๋๋ก let x = foo()
const fn
foo
ํฉ๋๋ค const fn
). ์ปดํ์ผ ํ์์ ์ผ๋ถ ํํ์์ ํ๊ฐํ ๊ฒฐ๊ณผ์ ์ด๋ฆ์ ์ง์ ํ๋ ค๋ฉด const
ํญ๋ชฉ์ด ํ์ํฉ๋๋ค.
์ด์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๋ฐ 20๋ฐฐ ๋ ์ค๋ ๊ฑธ๋ฆฝ๋๋ค.
const fn์ด ์๋ํ๋ ๋ฐฉ์์ ์ ํ ์๋๋๋ค!
const fn
ํจ์๋ฅผ ์ ์ธํ๊ณ ๊ทธ ์์ let
๋ฐ์ธ๋ฉ์ ์ถ๊ฐํ๋ฉด ์ฝ๋ ์ปดํ์ผ์ด ์ค์ง๋ฉ๋๋ค.
const fn
const
๋ฅผ ์ ๊ฑฐํ๋ฉด ํ๊ธฐ์ ์ธ ๋ณ๊ฒฝ์ด๋ฉฐ const
, static
๋๋ ๋ฐฐ์ด ๊ธธ์ด ๋ด๋ถ์์ ํด๋น ํจ์์ ๋ชจ๋ ์ฌ์ฉ์ ์ค๋จํฉ๋๋ค. ๋ฐํ์ ์ฝ๋์ด๊ณ const fn
๋ฅผ ์คํํ ์ฝ๋๋ ์ปดํ์ผ ํ์์ ์คํ๋์ง ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ๋ฐํ์ ํจ์ ํธ์ถ์ด๋ฏ๋ก ๋๋ ค์ง์ง ์์ต๋๋ค.
ํธ์ง: @SimonSapin ์ด ์ ๋ฅผ ์ด๊ฒผ์ต๋๋ค :D
Const fn์ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ปดํ์ผ ํ์์ ํ๊ฐ๋ฉ๋๋ค.
๊ทธ๊ฑด,
const fn random() -> i32 {
4
}
fn thing() -> i32 {
let i = random(); // the RHS of this binding is evaluated at compile-time, there is no call to random at runtime.
}
์ด์ ์ธ์๋ฅผ ์ทจํ๋ const fn์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ด๊ฒ์ ์ปดํ์ผ ํ์์ ํ๊ฐ๋ฉ๋๋ค.
fn thing() {
let x = const_fn_with_1_arg(const_fn_returns_value());
}
์ด๋ก ์ธํด const_fn_with_1_arg
๊ฐ ๋ฐํ์์ ํ๊ฐ๋ฉ๋๋ค.
fn thing() {
let x = const_fn_returns_value();
let y = const_fn_with_1_arg(x); // suddenly your program takes 20x longer to run, and compiles 20x faster.
}
@eddyb "์ต์ const fn"์ด ๋ชจ๋ ์ ์ฌ์ ์ธ ํฅํ ํ์ฅ๊ณผ ํธํ๋๋ค๋ ๊ด์ฐฐ๋ก ๋์์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ์ฆ, ๋ด ์ดํด๋ ์ฐ๋ฆฌ๊ฐ ์์ ํ๋๊ธฐ๋ฅผ ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
์์ ํจ์์ ๊ณ ์ ๋ฉ์๋๋ฅผ const๋ก ํ์ํ์ฌ ์์ ์ปจํ ์คํธ์์ ์์ ์ธ์์ ํจ๊ป ํธ์ถํ ์ ์์ต๋๋ค.
์ด๊ฒ์ "ํน์ฑ์ ๋ํ const ํจ๊ณผ" ๋์์ธ๊ณผ ๊ฑฐ์ ์๋ฒฝํ๊ฒ ํธํ๋๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค. ๋์ค์ const
์ ํ ์ฌํญ์ผ๋ก ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ "์ถ๋ก ๋ const" ๋์์ธ๊ณผ๋ ํธํ๋ฉ๋๋ค.
ํ์ฌ "minimal const fn" ์ ์๊ณผ ํธํ๋์ง ์๋ ๋์ฒด ๋ฏธ๋ ๋์์ธ์ด ์์ต๋๊น?
@nrc
rfcbot์ด ๊ทํ์ everything-const
์ฐ๋ ค ์ฌํญ์ ๋ฑ๋กํ์ง ์์์์ ์ฐธ๊ณ ํ์ญ์์ค(๋๊ธ๋น ํ๋์ ์ฐ๋ ค ์ฌํญ!) ๊ทธ๋ฌ๋ ์ด๋ ๋ด ์ด์ ์๊ฒฌ(TL;DR: ํ์ฌ ์ต์ ์ ์)์์ ํด๊ฒฐ๋ ์ค๊ณ ๋ฌธ์ ์ ํ์ ์งํฉ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋ชจ๋ ๊ฒ๊ณผ ์๋ฒฝํ๊ฒ ํธํ๋๋ฏ๋ก ํฅํ const
ํค์๋๋ฅผ ์ ํ ์ฌํญ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
์ฐ์ ์์/๋์ง ๋ฌธ์ ์ ๊ดํด์๋ ์ฐ๋ฆฌ๊ฐ ๋ ผ์ํ ๊ฒ๊ณผ ์์ง ๋ฌธ์ํํ์ง ์์ ๊ฒ์ ๋ฌธ์ํํ๊ณ ์ถ์ต๋๋ค.
const fn foo(x: i32) -> i32 { body }
๋ const FOO: i32 = body;
์ ๋นํด ์๋์ ์ผ๋ก ์์ ์ถ๊ฐ์ด๋ฏ๋ก ๋์ง ์ํ์ด ์ ์ต๋๋ค. ์ฆ, ์ค์ ๋ก const fn
๋ฅผ ๊ตฌํํ๋ ๋๋ถ๋ถ์ ์ฝ๋๋ ์ด๋ฏธ ์์ ์ ์ธ ์ปดํ์ผ๋ฌ์์ ์ด์ฌํ ์๋ํ๊ณ ์์ต๋๋ค.
์๋ฒ ๋๋ ์์ ๊ทธ๋ฃน์ const fn์ ์ฌํ๊ฒ ์ํฉ๋๋ค :)
๋ํ const fn
๋ฅผ ์์ ํ ํ์ง ์์ผ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ต์ ์ด ์๋ API๊ฐ ํ์ฐ๋ ์ ์์ต๋๋ค. ์๋ํ๋ฉด ๊ทธ๋ค์ const fns์ ๋ถ์กฑ์ ํด๊ฒฐํ๊ธฐ ์ํด ATOMIC_USIZE_INIT
์ ๊ฐ์ ํธ๋ฆญ์ ์ฌ์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
ํ์ ๋๋ = random(); // ์ด ๋ฐ์ธ๋ฉ์ RHS๋ ์ปดํ์ผ ํ์์ ํ๊ฐ๋๋ฉฐ ๋ฐํ์์๋ random์ ๋ํ ํธ์ถ์ด ์์ต๋๋ค.
์๋์, ์ ํ ์ผ์ด๋์ง ์์ต๋๋ค. ์ผ์ด๋ ์ ์์ง๋ง(๊ทธ๋ฆฌ๊ณ llvm์ด ์๋ง๋ ์ด๊ฒ์ ํ๊ณ ์์ ๊ฒ์
๋๋ค), ์ค์ ๋ก ๋ฐ์ํ๋ ๊ฒฝํ์ ๋ฐฉ๋ฒ์ ์์กดํ๋ ์ปดํ์ผ๋ฌ ์ต์ ํ๋ฅผ ๊ธฐ๋ํ ์๋ ์์ต๋๋ค. ์ปดํ์ผ ํ์์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ณ์ฐํ๊ณ ์ถ๋ค๋ฉด const
์ ๋ถ์ด๋ฉด ๊ทธ ๋ณด์ฅ์ ๋ฐ์ ์ ์์ต๋๋ค.
๊ทธ๋์ const fn์ const์์๋ง ํ๊ฐ๋๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ชจ๊ฐ ์์ต๋๊น?
๊ทธ๋ ๋ค๋ฉด const์ non-const fn์ ์๊ฒฉํ๊ฒ ๋ถ๋ฆฌํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
์๋ฏธ ์ฒด๊ณ๋ ์๋์ ์ผ๋ก ์ปดํ์ผ ์๊ฐ๊ณผ ๋ฐํ์ ํญ๋ชฉ์ ํผํฉํ๊ธฐ ๋๋ฌธ์ ์๋ง์ ๋๋ค.
๊ทธ๋์ const fn์ const์์๋ง ํ๊ฐ๋๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ชจ๊ฐ ์์ต๋๊น?
๊ทธ๊ฒ๋ค์ ์ธ๋ชจ๊ฐ ์์ผ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ค๋ฅธ ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐํ์์ ์คํ๋ฉ๋๋ค. ์ด๊ฒ์ ๋น์ ์ด const ํ๊ฐ์ ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ Rust์ ๋ค๋ฅธ "ํ์ ์ธ์ด"๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด const์ non-const fn์ ์๊ฒฉํ๊ฒ ๋ถ๋ฆฌํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
const fn
์ ๋ํ ์ ์ฒด ๋๊ธฐ๋ ์ด๋ฌํ ๋ถ๋ฆฌ๊ฐ ์๋ ๊ฒ์
๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ ๋ณธ์ฒด๊ฐ ๋์ผํ๋๋ผ๋ ๋ชจ๋ ์ข
๋ฅ์ ํจ์๋ฅผ ๋ณต์ ํด์ผ ํฉ๋๋ค. AtomicUsize::new()
+ AtomicUsize::const_new()
.
libcore
์ 90%๋ฅผ const eval์ฉ์ผ๋ก ํ ๋ฒ, ๋ฐํ์์ฉ์ผ๋ก ํ ๋ฒ, ๋ ๋ฒ ์์ฑํ์๊ฒ ์ต๋๊น? ๋ค๋ฅธ ๋ง์ ์์๋ ๋ง์ฐฌ๊ฐ์ง์ผ ๊ฒ์
๋๋ค.
AtomicUsize::Of<value>
์๊ฐํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์, ์ ์ ์๋ ๋ณด์ฅ์ ๋ฐ๋ ๊ฒ๋ณด๋ค ๋ชจ๋ ๊ฒ์ ๋ ๋ฒ ์์ฑํด์ผ ํฉ๋๋ค. (๊ฒ๋ค๊ฐ ์ด๊ฒ์ ๋ฌด์ธ๊ฐ๊ฐ const eval'๋๋์ง ์ฌ๋ถ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์๋ํ์ง ์์ต๋๋ค.)
const ํ๊ฐ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด const fn์์ const๋ฅผ ์ ์ธํ ์ ์์ต๋๊น(์ฌ๊ท์ const fn์ ๊ฒฝ์ฐ)? ์๋๋ฉด const ์ ๋ค๋ฆญ์ ๊ฑฐ์ณ์ผ ํฉ๋๊น? ๋ฑ.
@SoniEx2 ๋ const fn
์ ํ์ฉํ๊ณ ๋ ํจ์ ์ค ํ๋๊ฐ const
๊ฐ ์๋ ๊ฒฝ์ฐ ์ปดํ์ผ ์๊ฐ ์ค๋ฅ๋ก ์ ํํ๊ธฐ ์ํด ์์ ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์์
๋๋ค.
fn thing() {
const x: u32 = const_fn_returns_value();
const y: u32 = const_fn_with_1_arg(x);
}
(๋์ดํฐ์์ ์ ์ฒด ์คํ ์์ )
์ ํ ์ถ๋ก ์ด ์๊ธฐ ๋๋ฌธ์ ์ธ์ฒด๊ณตํ์ ์ด์ง ์์ง๋ง ํฅํ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
์ ์ ์๋ ๋ณด์ฅ์ ๋ฐ๋ ๊ฒ๋ณด๋ค
๋๋ฌด ์น์ ํ๊ณ ๋ถ๋ถ๋ช ํ๋ค๊ณ ์๊ฐ๋๋ ๋ถ๋ถ์ ๋ํ ๋ช ๊ฐ์ง ์๋ฅผ ๋ค์ด ์ฃผ์๊ฒ ์ต๋๊น?
const ํ๊ฐ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด const fn์์ const๋ฅผ ์ ์ธํ ์ ์์ต๋๊น(์ฌ๊ท์ const fn์ ๊ฒฝ์ฐ)? ์๋๋ฉด const ์ ๋ค๋ฆญ์ ๊ฑฐ์ณ์ผ ํฉ๋๊น? ๋ฑ.
const fn
์ ์์ ์ ์ปดํ์ผ ํ์์ ๋ง์ ์ฒ๋ผ ํ๊ฐํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. ์ปดํ์ผ ํ์ ์ ํ๊ฐํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
Rustc๊ฐ llvm์ ๊ธฐ๋ฐ์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ํ์์ ๋ง์ ์ฒ๋ผ ํ๊ฐํ๋ ๊ฒ์ ์ด๋ฏธ ์ผ์ด๋๊ณ ์์ต๋๋ค. ๊ทธ๋์ ... ์ ํํ ์ธ์ ocaml์์ ๊ตฌํ์ด ์ค๋จ๋์์ต๋๋ค. ์๋ฌด๋ Rustc์์ ์ง์์ ์ธ ์ ํ๋ฅผ ์ ๊ฑฐํ๊ณ ์ถ์ดํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
const fn
๋ ์ด๋ค ์์ผ๋ก๋ ์ง์์ ์ธ ์ ํ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. ์ค์๋ก const๊ฐ ์ ํ๋ ์ ์๋ ํจ์๊ฐ ์๊ณ llvm์ด ๊ทธ๋ ๊ฒ ํ๊ณ ๋ ์ด์ const ์ ํํ ์ ์๋ ๋ฐฉ์์ผ๋ก ํด๋น ํจ์๋ฅผ ๋ณ๊ฒฝํ๋ค๋ฉด llvm์ ๊ทธ๋ ๊ฒ ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ const
๋ฅผ ํจ์์ ์ฐ๊ฒฐํ๋ ๊ฒ๊ณผ ์์ ํ ๋
๋ฆฝ์ ์
๋๋ค. llvm์๋ const fn
์ fn
์ฌ์ด์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
๋์์ Rustc๋ const
๋ฅผ fn
์ ์ฒจ๋ถํ ๋ ๋์์ ์ ํ ๋ณ๊ฒฝํ์ง ์์ต๋๋ค(ํจ์๊ฐ ์ ํจํ const fn์ด๊ณ ๊ทธ๋ ๊ฒ ํ ํ์๋ ์ฌ์ ํ ์ปดํ์ผ๋๋ค๊ณ ๊ฐ์ ). ์ด์ ๋ถํฐ ์์๋ก ์ด ํจ์๋ฅผ ํธ์ถํ ์๋ง ์์ต๋๋ค.
์ ๋ LLVM์ ๋ํด ์๊ฐํ๊ณ ์๋ ๊ฒ์ด ์๋๋ผ ๋ น์ ๋ํด ์๊ฐํ๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์ LLVM์ ๋์๊ฒ ์ค์ํ์ง ์์ต๋๋ค.
@SoniEx2
Const fn์ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์ปดํ์ผ ํ์์ ํ๊ฐ๋ฉ๋๋ค.
์ด๊ฒ์ ์ ํํ์ง ์์ต๋๋ค. const fn
, ํน์ ์ปจํ
์คํธ์์ ํธ์ถ๋๋ฉด ์ปดํ์ผ ํ์์ ํ๊ฐ๋ฉ๋๋ค. ์ด๊ฒ์ด ๊ฐ๋ฅํ์ง ์๋ค๋ฉด ํ๋ ์ค๋ฅ๊ฐ ์๋ ๊ฒ์
๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ์ปจํ
์คํธ์์ const
๋ถ๋ถ์ ์ ํ ์ค์ํ์ง ์์ต๋๋ค.
const fn
๊ฐ ํ์ํ ์ปจํ
์คํธ์ ์๋ก๋ ๋ฐฐ์ด ๊ธธ์ด๊ฐ ์์ต๋๋ค. [i32; 15]
๋ฅผ ์ธ ์ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ 7
๋ฅผ ๊ณ์ฐํ ์ ์๊ธฐ ๋๋ฌธ์ [i32; 3+4]
๋ฅผ ์์ฑํ ์๋ ์์ต๋๋ค. [i32; read_something_from_network()]
๋ฅผ ์ธ ์ ์์ต๋๋ค. ๊ทธ๊ฒ ๋ฌด์จ ์๋ฏธ๊ฐ ์์๊น์? ์ด ์ ์์ ์ฌ์ฉํ๋ฉด foo
๊ฐ const fn
$ ์ธ ๊ฒฝ์ฐ $ [i32; foo(15)]
๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ ๋คํธ์ํฌ ์ก์ธ์ค์ ์ ์ฌํ๊ณ ๋ง์
์ ๊ฐ๊น๋๋ก ํฉ๋๋ค.
์ด๊ฒ์ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ์คํ๋๊ฑฐ๋ ์คํ๋ ์ฝ๋์ ๊ดํ ๊ฒ์ด ์๋๋๋ค . "์ปดํ์ผ ํ์์ ํ๊ฐํ ์ ์์"์ด ์์ต๋๋ค. "์ปดํ์ผ ํ์์ ํ๊ฐํ๊ฑฐ๋ ์ปดํ์ผ์ ์ค๋จํด์ผ ํจ"์ด ์์ต๋๋ค.
RFC๋ ์ฝ์ด๋ณด์ญ์์ค: https://github.com/rust-lang/rfcs/blob/master/text/0911-const-fn.md
const fn
์ฃผ์์ ์ฌ์ฉํ๋ ๋์ ์ถ๋ก ๋ ์์ฑ์ด๋ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ์์ค ์ฝ๋์์๋ ๋ช
์์ ์ด์ง ์์ง๋ง ์๋ ์์ฑ ๋ฌธ์์์๋ ์๋์ผ๋ก ๋ ์ด๋ธ์ด ์ง์ ๋ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๊ฐ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ ํ์ ์์ด const
๋ก ๊ฐ์ฃผ๋๋ ํญ๋ชฉ์ ๊ถ๊ทน์ ์ผ๋ก ํ์ฅํ ์ ์์ต๋๋ค. ์ฒ์์๋ const fn
๊ฐ ํ์ฌ ์ง์ํ๋ ๋ชจ๋ ๊ฒ์ผ๋ก ์ถ๋ก ์ด ์ ํ๋ ์ ์์ต๋๋ค(let ๋ฐ์ธ๋ฉ์ด ์๋ ์์ํ๊ณ ๊ฒฐ์ ์ ์ธ ํจ์).
์ด ์ ๊ทผ ๋ฐฉ์์์๋ ๊ฒฐ๊ณผ๊ฐ const
๋ณ์์ ๋ฐ์ธ๋ฉ๋ ๊ฒฝ์ฐ ์ปดํ์ผ ํ์์ ํ๊ฐ๊ฐ ๋ฐ์ํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฐํ์์ ํ๊ฐ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๊ฒ์ ํจ์๊ฐ ํ๊ฐ๋ ๋ ํธ์ถ์(ํธ์ถ์๋ณด๋ค)์ ๋ํ ์ ์ด๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋ ๋ฐ๋์งํด ๋ณด์
๋๋ค.
์ด๊ฒ์ ์ด๋ฏธ ์๋นํ ์ฒ ์ ํ๊ฒ ๋
ผ์๋์์ต๋๋ค. ๊ทธ ์ ๊ทผ ๋ฐฉ์์ ๋จ์ ์ ์ค์๋ก ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ธฐ๊ฐ ๋ ์ฝ๋ค๋ ๊ฒ์
๋๋ค. ๋๊ตฐ๊ฐ const
์ปจํ
์คํธ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ ์ ์์ง๋ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๊ฐ ๋ ์ด์ const
์ ์ฌ์ฉํ์ง ์๋๋ก ๋ง๋ค ์ ์์ต๋๋ค.
ํ ๊ทธ๊ฒ ๋ฌธ์ ์ง...
ํธ์ง: const fn
๊น์ง ๊ฐ์ง ์๊ณ ๋ด๊ฐ ์๊ฐํ ์ ์๋ ์ ์ผํ ํด๊ฒฐ์ฑ
์ ์ตํธ์์ ์ฃผ์์ ์ฌ์ฉํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๊ฐ const
๋ฅผ ์ค๋จํ ์ ์๋ ๊ถํ์ ๋ณด์ ํ ์ ์๋๋ก ํ๋ ๊ฒ์
๋๋ค. ๋ค์ค ํธ. ๊ทธ๋๋ const fn
๋ฅผ ์ฌ๋ฐฉ์ ๋ฟ๋ฆฌ๋ ๊ฒ๋ณด๋ค ๋์์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ ์ผํ ์ค์ง์ ์ธ ์ด์ ์ const
์ ํ์ฅ๋ ์ ์๋ฅผ ๋ณด๋ค ์ ์ํ๊ฒ ์ฑํํ๋ ๊ฒ์
๋๋ค.
ํธ์ง 2: ๋๋ ๊ทธ๊ฒ์ด ํ์ ํธํ์ฑ์ ๊นจ๋จ๋ฆด ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฏ๋ก ์ด๋ณด์๊ฐ ์๋๋๋ค. ์๊ธธ์ ์ฃ์กํฉ๋๋ค.
๊ทธ๋์... ํ ๋ก ์ ๋๋ฌ์ต๋๋ค. ์์ฝํ์๋ฉด:
rfcbot ๋๊ธ์ https://github.com/rust-lang/rust/issues/24111#issuecomment -376649804์ ๋๋ค.
ํ์ฌ ์ฐ๋ ค ์ฌํญ
const
ํ์ํ๊ธฐ ์์ํฉ๋๋ค. ์ด๋ ์ฑ๊ฐ์ ์ผ์
๋๋ค.๋๋ const fn
์ด ์ค๋ซ๋์ ๋ฐค๋ง๋ค ๊ตฌ์ด ๊ฒ์ ์ ์ธํ๊ณ ๋ ์ฐ์ ์์ + ๋์ง ์ฐ๋ ค์ ๋ํด ์ ๋ง๋ก ๋งํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ๋ ์ ์ ๋ฐ์ ํ๊ฒ ๊ด๋ จ๋์ด ์์ต๋๋ค. @eddyb ์ ๋์์ธ(https://github.com/rust-lang/rust/issues/24111#issuecomment-376829588 ๋ด๊ฐ ์ดํดํ ๋๋ก)์ const fn
๊ฐ ์๋๋ผ #[const]
๋ฌผ๊ฑด์ ๋๋ฆด ์ ์๋
#[const]
mod foo {
pub fn square(i: i32) -> i32 { i * i }
}
#[const]
fn bar(s: &str) -> &str i{ s }
#[const]
fn boo() -> fn(u32) -> u32 { meh }
fn meh(u: u32) -> u32 { u + 1 }
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ฌ๊ท์ ์ผ๋ก ๊ทธ๊ฒ์ผ๋ก ํ์๋ ๋ชจ๋ ๊ณณ์ผ๋ก ๋ค์ด๊ฐ๋ฏ๋ก #[const]
๋ชจ๋ ๋ด๋ถ์ ๋ชจ๋ ํจ์๋ #[const] fn
์
๋๋ค. #[const] fn
๋ด๋ถ์ ์ ์ธ๋ ํจ์๋ #[const] fn
์
๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ผ๋ถ ์์๊ฐ lib.rs
์ #![const]
๋ฅผ ์น๊ณ ๋๋ผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํ์ํ ์ฃผ์ ์๊ฐ ์ค์ด๋ญ๋๋ค.
ํด๋น ๋์์ธ์์ ๋ณผ ์ ์๋ ๋ฌธ์ (ํ์ง๋ง ์ด๋ฌํ ๋ฌธ์ ๋ ์ข
์ข
const fn
์๋ ์กด์ฌํจ):
#[const]
๋ชจ๋ ํธ๋ฆฌ ๋ด๋ถ ๊น์์ด ๋ช ๊ฐ์ง ๋น const ํจ์๋ฅผ ์ ์ธํ ์ ์๊ธฐ๋ฅผ ์ํ ์ ์์ผ๋ฏ๋ก ์ตํธ์์ ์ง์์ด ํ์ํ ์ ์์ต๋๋ค.#[const] fn
์ ๋ํ ํจ์ ํฌ์ธํฐ๋ $ #[const] fn
์ฌ์ผ ํฉ๋๊น?์ฐ๋ฆฌ๋ ์ด๋ฌํ ๊ฒ๋ค์ ๋ํด ์๊ฐํ ํ์๊ฐ ์์ผ๋ฏ๋ก const eval ๋์ ํจ์ ํฌ์ธํฐ๋ฅผ ํตํด ํจ์๋ฅผ ํธ์ถํ ์ ์๊ธฐ๋ฅผ ์ํ๋ ๋ฏธ๋ ๋ฒ์ ๊ณผ ํธํ๋์ง ์๋ ์์คํ ์ ์ค๊ณํ์ง ์์ต๋๋ค.
ํน์ ๋์์ธ์ ์ ์ํ ๊ฒ์ด ์๋๋ผ ์๋ ค์ง ๋ช ๊ฐ์ง ๊ทธ๋ด๋ฏํ ๋ฐฉํฅ์ ๋์ดํ์ ๋ฟ์
๋๋ค.
์๋ ์์ด๋์ด๋ const
์ ๊ตญํ๋์ง ์๊ณ ์ผ๋ฐํ๋ "๊ธฐ๋ฅ์ ๋ณธ๋ฌธ ๋
ธ์ถ" ์์ฑ์ด์์ง๋ง ๊ฐ๋ฅํ ๋ง์ ๋ณํ์ด ์์ผ๋ฉฐ ๊ทธ ์ค ์ผ๋ถ๋ ์ข์ ์๋ ์์ต๋๋ค .
ํธ์ง : (์ด ์ฌ์ค์ ์๊ณ ์ถ์ง ์์) @solson ์ Lean์ด @pattern
์ ๊ฐ์ ์์ฑ์ ๊ฐ๊ณ ์์ด ํจ์ ๋ณธ๋ฌธ์์ ๋ค์ํ ๊ฒ์ ์๋์ผ๋ก ํ์์ํค๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ์์ต๋๋ค.
@oli-obk unsafe
๋ ์์ฑ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์์ฑ์ ์ฌ์ฉํด์๋ ์ ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ํ ํ์ฌ async
๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๊ทธ๋ฆฌ๊ณ try { .. }
try fn
๋ฅผ ๋์
ํ๋ฉด ์์ฑ ๊ธฐ๋ฐ์ด ์๋ ๋ ๋ค๋ฅธ ๊ฒ์ด ์์ต๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ํจ๊ณผ์ ๊ฐ์ ์ผ์ ๊ฐ๋ฅํ ํ ์ผ๊ด๋๊ฒ ์ ์งํ๋ ค๊ณ ๋
ธ๋ ฅํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์์ฑ ์ฌ์ฉ ์ฌ๋ถ. #[target_feature(..)]
๋ ์ ์ฒด์ ์ธ ์ผ๊ด์ฑ์ ์ฃผ๋ฆ์ ์ค๋๋ค.
์ถ์ : const mod { .. }
๋ฅผ ์ฌ์ฉํ์ฌ #![const]
์ ๋์ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์ด๊ฒ์ try mod
, async mod
, unsafe mod
์๋ ์ ์ฉ๋ ์ ์์ต๋๋ค.
๋๋ ํญ์ ํน๋ณํ ์ ํ์ ์ผ์ ๊ธฐ๋ ๊ฒ์ ๋๋ค.
struct SizeOf<T>;
impl<T> SizeOf<T> {
const intrisic Result: usize;
}
์๋ก์ด ๊ตฌ๋ฌธ์ผ๋ก ์๋ก์ด ๊ฐ๋ ์ ๋ฐฐ์ฐ๋ ๊ฒ๋ณด๋ค ๊ธฐ์กด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ์๋ก์ด ์ ํ์ ๋ฐฐ์ฐ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค.
๋์ค์ ๋ฐํ์์ ์ ํ ์์คํ ์ ์ง์ํ ์ ์์ต๋๋ค.
fn sq(v: i32) -> i32 {
Square<v>::Result
}
์ปดํ์ผ ํ์์ ์ ํ, ์ปดํ์ผ ํ์ ๋๋ ๋ฐํ์์ const ์ ๋ค๋ฆญ.
๊ทธ๋์... ๋ ๋์ ๋์์ธ์ด ์์ ์ ์๋ค๋ ์ฌ์ค์ ๋ฌด์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋์ค์ ๋ฐํ์์ ์ ํ ์์คํ ์ ์ง์ํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ์์กด์ ํ์ดํ์ด๋ฉฐ, ๋ฐํ์์ const fn
๋ฅผ ํธ์ถํ๋ ๋์ ์ค๋๋ ์๋ ์ ์๋ํฉ๋๋ค.
@oli-obk ํน์ฑ์ ์ด๋ป์ต๋๊น? ํธ๋ ์ดํธ์ impl
์ค ์ผ๋ถ ์์๋ง const fn
์ธ ํธ๋ ์ดํธ ๋ฉ์๋์ ๋ํด ๋ฌด์์ ํ ๊ฒ์ธ์ง์ ๋ํ ์์ด๋์ด ์์ด const fn
๋ฅผ ์์ ํํ๊ณ ์ถ์ง ์์ต๋๋ค.
@eddyb ๋ ์๋ก์ด const ๊ฒฝ๊ณ์ ๋ฉ์๋๋ฅผ ์ ์ํ๊ฒ ์์ฑํด์ผ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. :)
@Centril ๋ด ์์ ์ ์์ฑ ์ ์(ํค์๋ ์ฌ์ฉ ์ฌ๋ถ์ ๊ด๊ณ์์ด)์ด ํน์ฑ ๋ฉ์๋๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์ฌ ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ด๋ํ๋ค๋ ๊ฒ์ด๋ฉฐ, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋น๊ต ํด์ผ ํฉ๋๋ค .
ํ์ฌ์ const fn
์ ๊ทผ ๋ฐฉ์์ ๊ฐ๋จํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง ์ค์ ๋ก ํ์ฅํ ๋๋ ๊ทธ๋ ์ง ์์ต๋๋ค .
์ผ๋ฐ const + const ์ ๋ค๋ฆญ:
intrinsic const SizeOf<T>: usize;
const Pow<const V: usize>: usize = V*V;
@eddyb ์ ๋ const fn ๋์์ธ๊ณผ ์๋ฒฝํ๊ฒ ํธํ๋๋ ๋ค์ํ ์๋ฃจ์ ์ ์ผ๋์ ๋๊ณ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ธ ๊ฒ์ด๋ค.
์, ์ด์ ๋ง ์์ํ์ง โโ2๋ ์ด ๋ ๊ฑธ ๋ดค์ต๋๋ค. ์์ ํ ๋ ์ง๊ฐ ์์๋ฉ๋๊น? ์ด ํ์ฅ์ด ์์ ํ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋ง๊ตฌ๊ฐ ์์ ๊ฑฐ์ ์ฌ์ฉํ ์ ์๋ ์์๊ฐ ์์ต๋๋ค. :)
@rfcbot ์ ๋ฐํ์ ํฌ์ธํฐ ์ฃผ์์ ๊ด๋ จ์ด ์์ต๋๋ค.
๋ค๋ฅธ ๋ฌธ์ ์์๋ const fn
์์ ์ฐธ์กฐ ํฌ๋ช
์ฑ์ ์ํ๋์ง ์ฌ๋ถ์ ๋ํ ์ง๋ฌธ์ด ์ ๊ธฐ๋์์ผ๋ฉฐ ์์ ํฌ์ธํฐ์ ์ฃผ์๊ฐ ๋น๊ฒฐ์ ๋ก ์ ์ค๋ผํด๋ก ์ฌ์ฉ๋๋ ๋ฌธ์ ๊ฐ ๋ํ๋ฌ์ต๋๋ค. https://github.com/rust- lang/rust/issues/49146#issuecomment -386727325. ์ฌ๊ธฐ์ ์ค๋ช
๋ ์๋ฃจ์
์ด ์์ง๋ง ์์ ํ ์ ์ ์ผ๋ถ ์์ ํฌ์ธํฐ ์์
์ unsafe
(์ค๋๋ ํ์ฉ๋๋ ๋ช ๊ฐ์ธ์ง ํ์คํ์ง ์์) ๋ง๋๋ ์์
์ด ํฌํจ๋ฉ๋๋ค.
@eddyb E0018 ์ const fn
์๋ ์ ์ฉ๋์ง ์๋์?
C ๋ฐฉ์์ ์๋์ (์ฆ, ๊ฐ์ฒด ๋ด๋ถ)์ด ์๋๋ฉด ๊ฐ์ฒด ํฌ์ธํฐ๊ฐ ๋ชจ๋ 0์ด ๋๋๋ก ํ์ฉ๋๊ณ ๋ฐํ์์ ์ด๋ป๊ฒ๋ ์ถ์ ๋๋ค๋ ๊ฒ์ ๋๋ค.
Rust๊ฐ C์ ์จ๋ฆฌ์ด์ฑ ๊ท์น์ ์ง์ํ๋์ง ํ์คํ์ง ์์ต๋๋ค.
@sgrif ์์์ ๋ํด ๋ฐ์ํ๋ ๋ง์ ์ค๋ฅ๋ ์กฐ๋ง๊ฐ ์ฌ๋ผ์ง ๊ฒ์
๋๋ค - miri๋ ๊ฐ์ด ํ์๋๋ ์ ํ์ ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. usize
๊ฐ์ ์๋ ์ถ์ ์์น๋ ์ฌ์ ํ ์ถ์ ์์น์
๋๋ค. (๊ทธ๋ฆฌ๊ณ ํฌ์ธํฐ๋ก ์บ์คํ
ํ๋ฉด ์๋ ํฌ์ธํฐ๋ฅผ ๋ค์ ์ป์ ์ ์์ต๋๋ค).
๋ฐฉ๊ธ ํ์ธํ๊ณ ์ง๊ธ ์ ์ ์์ ๋ํ ํฌ์ธํฐ ์บ์คํ ๊ณผ ํฌ์ธํฐ ๊ฐ์ ๋น๊ต ์ฐ์ฐ์๊ฐ ์์ ์ปจํ ์คํธ์์ ๊ธ์ง๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์๊ฐํ ๊ฒ์ ๋๋ค . ๋๋ ์ฌ์ ํ ๋๋ ต์ต๋๋ค.
@eddyb ์ถฉ๋ถํฉ๋๋ค. ๊ทธ๋ฌ๋ const fn
์ ๋๋ฌํ ์ฐ๋ ค ์ฌํญ์ ์ค๋ ์ด๋ฏธ const
๋ธ๋ก์ ๋๋ฌํ์ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
@sgrif ์ฐจ์ด์ ์ const
(์ ๋ค๋ฆญ ์ ํ ๋งค๊ฐ๋ณ์์ ์์กดํ๋ ์ฐ๊ด๋ const
๋ ํฌํจ)์ miri์์ ์ปดํ์ผ ํ์์ ์์ ํ ํ๊ฐ ๋๋ ๋ฐ๋ฉด const fn
๋ const
fn
๋ฐํ์ ํธ์ถ.
๋ฐ๋ผ์ ์ฐธ์กฐ ํฌ๋ช
์ฑ์ ์ ๋ง๋ก ์ํ๋ฉด miri์์ ๋ฌธ์ ๊ฐ ์๋๋ผ๋ ๋ฐํ์ ๋น๊ฒฐ์ ์ฑ์ ์ ๋ฐํ ์ ์๋ ๊ฒ๋ค์ (์ ์ด๋ ์์ ํ ์ฝ๋์์) ํ์ฉํ์ง ์๋๋ก ํด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด NaN ํ์ด๋ก๋ ๋๋ฌธ์ float ๋นํธ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ ๋ํ ๋ฌธ์ ๊ฐ ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.
๋ฏธ๋ฆฌ์์ ํด์ผ ํ ์ผ:
๋ชจ๋ ํฌ์ธํฐ๋ ์๋๊ฐ ์๋ ๊ฒฝ์ฐ 0์ ๋๋ค. ์:
#[repr(C)]
struct X {
a: usize,
b: u8,
}
let x = X { a: 1, b: 2 };
let y: usize = 3;
assert_eq!(&x as *const _ as usize, 0);
assert_eq!(&x.a as *const _ as usize, 0);
assert_eq!(&x.b as *const _ as usize, 8);
assert_eq!(&y as *const _ as usize, 0);
๊ทธ๋ฐ ๋ค์ ๋ฏธ๋ฆฌ ํ๊ฐ์์ ์ถ์ ํฉ๋๋ค. ํฌ์ธํฐ์์ ํฌ์ธํฐ๋ก ๋ค์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ผ๋ถ ํญ๋ชฉ์ UB์ด์ง๋ง ํ์ฉํ์ง ์๊ธฐ ์ฝ์ต๋๋ค(์ฌ์ฉ์ ํฌ์ธํฐ๋ก ๋ณํํ๋ ๊ฒ์ ๊ธ์งํฉ๋๋ค. ๋ฐํ์/ํ๊ฐ ์๊ฐ์ ์ด๋ฏธ ํฌ์ธํฐ๋ฅผ ์ถ์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค).
float ๋นํธ์ ๊ฒฝ์ฐ NaN ์ ๊ทํ?
๋๋ ๊ทธ ๋ ๊ฐ์ง ๋ชจ๋๊ฐ ๋ชจ๋ ๊ฒ์ ๊ฒฐ์ ์ ์ผ๋ก ๋ง๋ค ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์๋ฅผ ๋ค์ด NaN ํ์ด๋ก๋ ๋๋ฌธ์ float ๋นํธ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ ๋ํ ๋ฌธ์ ๊ฐ ๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.
์์ ํ ์ฐธ์กฐ ํฌ๋ช ์ฑ์ ์ํด์๋ ๋ชจ๋ float ์ฐ์ฐ์ ์์ ํ์ง ์๊ฒ ๋ง๋ค์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ถ๋ ์์์ ๊ฒฐ์ ๋ก ์ ์ด๋ ต๋ค
์ฌ๊ธฐ์ ๊ฐ์ฅ ์ค์ํ ์ ์ LLVM์ ์ตํฐ๋ง์ด์ ๊ฐ ๋ถ๋ ์ฐ์ฐ์ ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ณ ๋ณ๊ฒฝํ ์ ์์ ๋ฟ๋ง ์๋๋ผ ๊ฒฐํฉ๋ opcode๊ฐ ์๋ ์ฐ์ฐ์ ~์ํ~ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ ์ ์ค์ ์ฐจ์ด๊ฐ ๋ฏธ๋ฏธํ๋๋ผ๋ ์์ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ด๋ miri๊ฐ llvm ์ต์ ํ๋์ง ์์ mir๋ฅผ ์คํํ๋ ๋ฐ๋ฉด ๋์์ ๊ธฐ๋ณธ ์ฝ๋์ ๋ค๋ฅธ ์๋ฏธ ์ฒด๊ณ๋ฅผ ๊ฐ๋ llvm์ ์ต์ ํ๋๊ณ ์ฌ์ ๋ ฌ๋ ์ ์์ผ๋ฏ๋ก ์ฐธ์กฐ ํฌ๋ช ์ฑ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์ฐธ์กฐ ํฌ๋ช ์ฑ์ด ์ผ๋ง๋ ์ค์ํ์ง์ ๋ํ ๊ฒฐ์ ์ด ๋ด๋ ค์ง ๋๊น์ง ํ์ฌ๋ก์๋ float๊ฐ ์๋ ์ฒซ ๋ฒ์งธ ์์ ์ ์ธ const fn ๊ธฐ๋ฅ์ ๋์ํ์ง๋ง const fn์ด ํด๋น ๋ ผ์๋ก ์ธํด ๋๋ ค์ง๊ฑฐ๋ ์ฐจ๋จ๋๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค.
์ฌ๊ธฐ์ ๊ฐ์ฅ ์ค์ํ ์ ์ LLVM์ ์ตํฐ๋ง์ด์ ๊ฐ ๋ถ๋ ์ฐ์ฐ์ ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ณ ๋ณ๊ฒฝํ ๋ฟ๋ง ์๋๋ผ ๊ฒฐํฉ๋ opcode๊ฐ ์๋ ํจ์ฆ ์ฐ์ฐ์ ์ํํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ์ค์ ์ฐจ์ด๊ฐ ๋ฏธ๋ฏธํ๋๋ผ๋ ์์ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
Fusing ์ฐ์ฐ(๋๋ ๋น์ ์ด mul-add๋ฅผ ์ฐธ์กฐํ๋ค๊ณ ๊ฐ์ )์ ๊ฒฐ๊ณผ์ ๋ฐ์ฌ๋ฆผ์ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ fast-math ํ๋๊ทธ ์์ด๋ ํ์ฉ๋์ง ์๊ฑฐ๋ ์ํ๋์ง ์์ต๋๋ค. LLVM์ IEEE ํธํ ํ๋์จ์ด๋ฅผ ๋์์ผ๋ก ํ ๋ "๊ธฐ๋ณธ ๋ถ๋ ์์์ ํ๊ฒฝ"์์ ์ค์ ํ ์ ํ ๋ด์์ ๋ถ๋ ์์์ ์ฐ์ฐ์ ์ ํํ ์๋ฏธ๋ฅผ ์ ์งํ๊ธฐ ์ํด ๋งค์ฐ ์ฃผ์ํฉ๋๋ค.
LLVM์ด ๋ณด์กดํ๋ ค๊ณ ํ์ง ์๋ ๋ ๊ฐ์ง๋ NaN ํ์ด๋ก๋์ NaN์ ์ ํธ์ฑ์ ๋๋ค. ๋ ๊ฐ์ง ๋ชจ๋ ๊ธฐ๋ณธ fp ํ๊ฒฝ์์ ๊ด์ฐฐํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ๊ธ์งํด์ผ ํ๋ float์ ๋นํธ๋ฅผ ๊ฒ์ฌํด์ผ๋ง ํฉ๋๋ค. (๊ทธ๋ฆฌ๊ณ LLVM์ด ์ด์ ๋ํด ๋ ์ฃผ์๋ฅผ ๊ธฐ์ธ์๋ค ํ๋๋ผ๋ ํ๋์จ์ด๋ NaN ํ์ด๋ก๋๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์๋ ๋ค์ํ๋ฏ๋ก LLVM์ ๊ณ ์ ํ ์ ์์ต๋๋ค.)
์ปดํ์ผ๋ฌ์ ๊ฒฐ์ ์ด ๋ถ๋ ์์์ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ๋ค๋ฅธ ์ฃผ์ ์ฌ๋ก๋ x87 (SSE ์ด์ ) ์ฝ๋์์ ์ ์ถ ๋ฐ ๋ค์ ๋ก๋์ ์์น์ ๋๋ค. x87์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ค๊ฐ ๊ฒฐ๊ณผ์ ๊ฒฝ์ฐ 80๋นํธ๋ก ๋ฐ์ฌ๋ฆผํ๊ณ ์ ์ฅ์์ ๊ฒฝ์ฐ 32 ๋๋ 64๋นํธ๋ก ๋ฐ์ฌ๋ฆผํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋๋ถ๋ถ ๋ฌธ์ ์ ๋๋ค. ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ์ฌ๋ฆผ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํด ๊ฐ FPU ๋ช ๋ น ์ ์ ๋ฐ์ฌ๋ฆผ ๋ชจ๋๋ฅผ ์ ์ ํ๊ฒ ์ค์ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง ์ค์ ๋ก๋ ์ค์ฉ์ ์ด์ง ์์ผ๋ฏ๋ก (๋ด ์๊ฐ์) LLVM์ ์ด๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
๋ด ๊ฒฌํด๋ ์ฐ๋ฆฌ๊ฐ ์์ ํ ์ฐธ์กฐ ํฌ๋ช ์ฑ๊ณผ ํจ๊ป ๊ฐ์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ์ด๊ฒ์ด ํธ๋ฆฌํจ/์๋ฒฝ ํจ๋ณด๋ค ์์ /์ ํํจ ์ ์ ํํ๋ค๋ ์ ๋ฐ์ ์ธ Rust ๋ฉ์์ง์ ์ด์ธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฐธ์กฐ ํฌ๋ช ์ฑ์ ๋ฑ์ ์ถ๋ก ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ง์ ์ถ๋ก ์ด์ ์ ์ถ๊ฐํฉ๋๋ค(์ตํ์๊น์ง์ง๋ง ๋น ๋ฅด๊ณ ๋์จํ ์ถ๋ก ์ ๋๋์ ์ผ๋ก ์ณ ์ต๋๋ค).
๊ทธ๋ฌ๋ ๋ฌผ๋ก ๋จ์ ์ด ์์ต๋๋ค. ์์ ์ฑ wrt ์์ค. CTFE. ์ด๊ฒ์ ์ฐธ์กฐ ํฌ๋ช
const fn
๋ฉ์ปค๋์ฆ์ด ์ปดํ์ผ ์๊ฐ์ ์ฐธ์กฐ ํฌ๋ช
ํ์ง ์์ const fn
์ฒด๊ณ๋งํผ ํ๊ฐํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ฐธ์กฐ ํฌ๋ช
์ฑ์ ๊ณ ์ํ์ง ๋ง์๊ณ ์ ์ํ๋ ์ฌ๋๋ค๋ก๋ถํฐ ์ด ์ ์์ ๋ํด ๊ฐ๋ฅํ ํ ๋ง์ ๊ตฌ์ฒด์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ ๊ณตํ์ฌ ์ฐ๋ฆฌ๊ฐ ์ ์ถฉ์ ์ ํ๊ฐํ ์ ์๋๋ก ์์ฒญํฉ๋๋ค.
์ข์, ๋น์ ์ด LLVM ํฌ์ธํธ์ ๋ํด ์ณ์ ๊ฒ ๊ฐ์ต๋๋ค. ๋น ๋ฅธ ์ํ ๋ชจ๋๋ฅผ ํ์ฑํํ์ง ์๋ ํ ์ค์ ๋ก ๊ณ์ฐ์ ์๋ชป๋ ์ฐ์ฐ์ ํผํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ ๋ถ๋ ์์์ ์ฐ์ฐ์ด ๋ด๋ถ ์ ๋ฐ๋์ ๊ฐ์ด ์์กดํ๋ ์ํ ๊ฐ ์ฌ์ ํ ๋ง์ด ์์ต๋๋ค. CTFE ๋ถ๋ ๊ณ์ฐ๊ธฐ๋ ๋ฐํ์์ ๋ด๋ถ ์ ๋ฐ๋ ๊ฐ์ ์๊ณ ์์ต๋๊น?
๋ํ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ํ๋ฆฌ๋ ๋์ ๋ด๋ถ ๊ฐ์ ieee754 ํ์์ผ๋ก ๋ณํํ์ฌ ์ ๋ฐ๋๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. ์ด๊ฒ์ ๊ฒฐ๊ณผ์๋ ์ํฅ์ ์ค ์ ์์ผ๋ฉฐ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ถ์ ์ํํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ง์ ๋์ง ์์์ต๋๊น?
@est31 ์ปดํ์ผ ์๊ฐ๊ณผ ๋ฐํ์ ๋์์ด ๋ค๋ฅธ์ง ์ ๊ฒฝ ์ฐ์ง ์๊ณ ๋ฐ๋ณต ํธ์ถ(๊ณ ์ ๋ ๊ฐ์ฒด ๊ทธ๋ํ ํฌํจ)์ด ์ผ๊ด๋๊ณ ์ ์ญ ๋ถ์์ฉ์ด ์๋ค๋ ๊ฒ๋ง ๊ฐ์ ํ์ต๋๋ค.
๋ฐ๋ผ์ ์ฐธ์กฐ ํฌ๋ช ์ฑ์ ์ ๋ง๋ก ์ํ๋ฉด miri์์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋ฐํ์ ๋น๊ฒฐ์ ์ฑ์ ์ ๋ฐํ ์ ์๋ ํญ๋ชฉ์ (์ ์ด๋ ์์ ํ ์ฝ๋์์) ํ์ฉํ์ง ์๋๋ก ํด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ ์ฌ๊ธฐ์ ๋ชฉํ๋ const fn
๊ฐ ์คํ ์ค์ miri๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์ํ๋๋ผ๋ ๋ฐํ์์ ๊ฒฐ์ ๋ก ์ ์ด๊ณ ๋ถ์์ฉ์ด ์๋๋ก ๋ณด์ฅํ๋ ๊ฒ์
๋๋ค. ์ ์ด๋ const fn
๊ฐ ์์ ํ ์์ ํ๋ค๋ฉด ์ํธ? ๋๋ ๊ทธ๊ฒ์ ์ค์ํ๊ฒ ์๊ฐํ ์ ์ด ์๋ค, TBH. ์ด๊ฒ์ ๋งค์ฐ ๊ฐ๋ ฅํ ์๊ตฌ ์ฌํญ์ด๋ฉฐ ์ค์ ๋ก ์ ์ด๋ ptr-to-int ๋ฐ float-to-bits๋ฅผ ์์ ํ์ง ์๊ฒ ๋ง๋ค์ด์ผ ํ๋ฏ๋ก ์ค๋ช
ํ๊ธฐ ์ด๋ ค์ธ ๊ฒ์
๋๋ค. OTOH, ์ฐ๋ฆฌ๋ ๋ํ ์์ ํฌ์ธํฐ ๋น๊ต๋ฅผ ์์ ํ์ง ์๊ฒ ๋ง๋ค์ด์ผ ํ๋ฉฐ ๊ทธ๊ฒ์ ๋ํด ๋ง์กฑํ ๊ฒ์
๋๋ค :D
์ด์ ๋ํ ๋๊ธฐ๋ ๋ฌด์์ ๋๊น? Rust๊ฐ ํ๋ ๊ฐ์ง๊ณ ์์๊ณ ์์ด๋ฒ๋ ธ๋ ์๋์ ํจ๊ณผ ์์คํ ์ ๋ค์ ๋์ ํ๋ ค๊ณ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ง๋ ๋ฌด๊ฒ๋ฅผ ์งํฑํ์ง ์์๊ธฐ ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค(ํธ์ง: ๋๋ ๋ชจ๋ ๋ค๋ฅธ ์์ ์ ์ํํ ๋งํผ ์ถฉ๋ถํ ์ ์ฐํ์ง ์์๊ธฐ ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค. ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ๋ ๊ฒ, https://mail.mozilla.org/pipermail/rust-dev/2013-April/003926.html ์ฐธ์กฐ).
ptr-to-int๋ ๊ฐ์ฒด์ ์์ ๋ถ๋ถ์์ ๋ณํํ๊ณ int-to-ptr์ด ์คํจํ๋๋ก ํ์ฉํ๋ ๊ฒฝ์ฐ ์์ ํฉ๋๋ค. 100% ๊ฒฐ์ ์ ์ผ ๊ฒ์ ๋๋ค. ๋ชจ๋ ํธ์ถ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค.
ptr-to-int๋ ์์ ํ๊ณ int-to-ptr์ ์์ ํ์ง ์์ต๋๋ค. ptr-to-int๋ const ํ๊ฐ์์ "์์์น ๋ชปํ" ๊ฒฐ๊ณผ๋ฅผ ํ์ฉํด์ผ ํฉ๋๋ค.
์ธํฐํ๋ฆฌํฐ/VM์์ NaN ์ ๊ทํ๋ฅผ ์ค์ ๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค. (์๋ฅผ ๋ค์ด LuaJIT๋ ๋ชจ๋ NaN ๊ฒฐ๊ณผ๋ฅผ ํ์ค NaN์ผ๋ก ๋ง๋ค๊ณ ๋ค๋ฅธ ๋ชจ๋ NaN์ ํจํน๋ NaN์ผ๋ก ๋ง๋ญ๋๋ค.)
ptr-to-int๋ ๊ฐ์ฒด์ ์์ ๋ถ๋ถ์์ ๋ณํํ๊ณ int-to-ptr์ด ์คํจํ๋๋ก ํ์ฉํ๋ ๊ฒฝ์ฐ ์์ ํฉ๋๋ค. 100% ๊ฒฐ์ ์ ์ผ ๊ฒ์ ๋๋ค. ๋ชจ๋ ํธ์ถ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค.
๋ฐํ์์ ์ด๊ฒ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๊น? (&mut *Box::new(...)) as usize
๋ ํ์ฌ ๋น๊ฒฐ์ ์ ํจ์์ด๋ฉฐ ๋ชจ๋ const fn
์ฌ์ผ ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ํญ์ ๋์ผํ ๊ฐ์ ๋ฐํํ๋ค๋ ์๋ฏธ์์ "๋ฐํ์์ ์ฐธ์กฐ ์ ์ก"๋๋๋ก ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
Box::new๋ VM์์ ์ถ์ ๋ ํฌ์ธํฐ๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
๋ณํ์ ์ปดํ์ผ ํ์์ 0์ด ๋ฉ๋๋ค(์ฆ, const ํ๊ฐ์์). ๋น const ํ๊ฐ์์๋ ๋ฌด์์ด๋ ๋ฐํํฉ๋๋ค.
์ถ์ ํฌ์ธํฐ๋ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค.
ํฌ์ธํฐ๋ฅผ ํ ๋นํ๊ณ ํ ๋นํฉ๋๋ค. ํ ๋นํ ๋ VM์ ํฌ์ธํฐ ๊ฐ์ 0์ผ๋ก ์ค์ ํ์ง๋ง ํฌ์ธํฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ์ ธ์ ์กฐํ ํ ์ด๋ธ์ ์ฐ๊ฒฐํฉ๋๋ค. ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ๋ ์กฐํ ํ ์ด๋ธ์ ํตํด ์ด๋ํฉ๋๋ค. ํฌ์ธํฐ์ ๊ฐ(์ฆ, ํฌ์ธํฐ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ์ดํธ)์ ์ป์ผ๋ฉด 0์ ์ป์ต๋๋ค. ๊ทธ๊ฒ์ด ๊ฐ์ฒด์ ๊ธฐ๋ณธ ํฌ์ธํฐ๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค.
Box::new๋ VM์์ ์ถ์ ๋ ํฌ์ธํฐ๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ฐํ์ ๋์์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. ์์์ ๊ฐ์ด ์ด๊ฒ์ด ๋ฐ์ด๋๋ฆฌ์์ ์คํ๋๋ฉด ์ด๋ป๊ฒ ๋ฉ๋๊น? VM์ด ์์ต๋๋ค.
๋ฏธ๋ฆฌ๋ ์ด๋ฏธ ์ด ๋ชจ๋ ๊ฒ์ ํ๋ฅญํ๊ณ ์์ ํ ๊ฒฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ํ const fn
๋ฐ ๋ฐํ์ ๊ฒฐ์ ์ ๋ํ ์ฐ๋ ค๋ก ๋์๊ฐ์: ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ํ๋ค๋ฉด(์ฐ๋ฆฌ๊ฐ ๊ทธ๋ ๊ฒ ํ ์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ฌ์ ํ ์ฐ๋ฆฌ๊ฐ ์ ์ ๊ฒฝ์ ์ฐ๋์ง ์ค๋ช
ํด์ค ๋๊ตฐ๊ฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค :D ), ์ฐ๋ฆฌ๋ ๋ค์์ ์ ์ธํ ์ ์์ต๋๋ค. ptr-to-int ๋ฐ float-to-bits๋ ๋น const ์ฐ์ฐ์ด ๋ฉ๋๋ค. ๊ทธ๊ฒ์ ๋ฌธ์ ๊ฐ ์์ต๋๊น?
@RalfJung ๋๋ ์ด๋ฏธ ์ฐ๋ ค ์๊ฒฌ์ https://github.com/rust-lang/rust/issues/49146#issuecomment -386727325๋ฅผ ์ฐ๊ฒฐํ์ต๋๋ค. ์๋ง๋ ๋ค๋ฅธ ๋ฉ์์ง ์๋์์ ๊ธธ์ ์์์ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ @Centril์ด ์ ์ํ ์๋ฃจ์
์ ๋ํ ์ค๋ช
์ด ํฌํจ๋์ด ์์ต๋๋ค( unsafe
์์
์ ๋ง๋ค๊ณ ๋ช ๊ฐ์ง "์ฌ๋ฐ๋ฅธ ์ฌ์ฉ"์ ํ์ดํธ๋ฆฌ์คํธ์ ์ถ๊ฐํฉ๋๋ค(์: ptr-to-int ๋ฐ NaN-์ ๊ทํ float-to-bits์ ๊ฒฝ์ฐ offset_of
).
@eddyb ํ์คํ ๋ค์ํ ์๋ฃจ์ ์ด ์์ต๋๋ค. ๋ด๊ฐ ์๊ตฌํ๋ ๊ฒ์ ๋๊ธฐ์ ๋๋ค. ๊ฑฐ๊ธฐ์์๋ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
๋ํ IRC์์ ์ ์์ ์ ์ธ์ฉ: ptr-to-int ์บ์คํธ๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ์๋ CTFE ๊ฐ ๊ฒฐ์ ์ ์ด๋ผ๊ณ ์ ๋นํ๊ฒ ์ฃผ์ฅํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋น๊ฒฐ์ ๋ก ์ ์ค์ ๋ก ๊ด์ฐฐํ๋ ค๋ฉด ์ฌ์ ํ ๋น CTFE ์ฝ๋(์: int๋ก ์บ์คํ ๋ ptr ๋นํธ ์ถ์ถ)๊ฐ ํ์ํฉ๋๋ค.
const fn thing() -> usize {
(*Box::new(0)) as *const _ as usize
}
const X: usize = thing();
const Y: usize = thing();
X == Y์ ๋๊น?
๋ด ์ ์์ผ๋ก X == Y.
foo as *const _ as usize as *const _
๋ฅผ ๊นจ๋ @SoniEx2
๋๊ธฐ ๋ถ์ฌ:
์ ๋ ๊ฐ์ธ์ ์ผ๋ก ์ปดํ์ผ ์๊ฐ ๋์๊ณผ ๋ค๋ฅธ ๋ฐํ์ ๋์ ๋๋ ๋ฐํ์ ์ const fn์ด ๋น๊ฒฐ์ ์ ์ด๋ผ๋ ๋ฌธ์ ๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค. ์ฌ๊ธฐ์ ์์ ์ ๋ฌธ์ ๊ฐ ์๋๋ฏ๋ก ์์ ํ์ง ์์์ ์์ ํ ์๋ชป๋ ํค์๋์
๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ปดํ์ผ ํ์ ํ๊ฐ์์ ์์ ํ ํฌ์ฐฉํ๊ณ ์๋ ๋๋ผ์ด ๋์์
๋๋ค. ์ผ๋ฐ ๊ธฐ๋ฅ์์ ์ด๋ฏธ ์ด ์์
์ ์ํํ ์ ์์ผ๋ฏ๋ก ๋๋ผ์ธ ์ผ์ด ์์ต๋๋ค. Const fn์ ๋ฐํ์์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ปดํ์ผ ํ์์ ๊ธฐ์กด ํจ์๋ฅผ ํ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ํ์ํ๋ ๊ฒ์
๋๋ค. ์๊ฒฐ์ ๊ดํ ๊ฒ์ด ์๋๋๋ค. ์ ์ด๋ ppl์ด "์์ํ ์ง์ฅ"์ ๋ํด ์ด์ผ๊ธฐํ ๋ ์ป์ ๋๋์
๋๋ค(๋๋ ์ฃผ๋ณ์ ์์์ผ๋ฏ๋ก ์คํดํ ์ ์์)
@SoniEx2 ๋ค, ํญ์ X == Y
์
๋๋ค.
๊ทธ๋ฌ๋ ๋ค์์ด ์๋ ๊ฒฝ์ฐ:
const fn oracle() -> bool { let x = 0; let y = &x as *const _ as usize; even(y) }
fn main() {
assert_eq!(oracle(), oracle());
}
๊ทธ๋ฌ๋ฉด ๋ฐํ์์ main
๊ฐ ํจ๋ํ ์ ์์ต๋๋ค.
@RalfJung
๋๋ ์ฌ๋๋ค์ด ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ๋ ๋ชจ๋ ๋ค์ํ ์์ ์ ์ํํ ๋งํผ ์ถฉ๋ถํ ์ ์ฐํ์ง ์์๊ธฐ ๋๋ฌธ์ [..]
๊ทธ ๋ฌผ๊ฑด๋ค์ ๋ฌด์์ด์์ต๋๊น? ์ด๊ฒ์ ํ์ธ ์์ด ํ๊ฐํ๊ธฐ๋ ์ด๋ ต๋ค.
ptr-to-int ์บ์คํธ๊ฐ ํ์ฉ๋๋ ๊ฒฝ์ฐ์๋ CTFE๊ฐ ๊ฒฐ์ ์ ์ด๋ผ๊ณ ์ ๋นํ๊ฒ ์ฃผ์ฅํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
[...]
๋น๊ฒฐ์ ๋ก ์ ์ค์ ๋ก ๊ด์ฐฐํ๋ ค๋ฉด ์ฌ์ ํ ๋น CTFE ์ฝ๋(์: int๋ก ์บ์คํ ๋ ptr ๋นํธ ์ถ์ถ)๊ฐ ํ์ํฉ๋๋ค.
์, $ const fn
const fn
๋ ์ปดํ์ผ ์๊ฐ์ ์คํ๋ ๋ ์ฌ์ ํ ๊ฒฐ์ ์ ์ด์ง๋ง ๋ฐํ์์ ๊ฒฐ์ ์ ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค fn
) const fn
์ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ์์ ๋ฌด์์ด๋ ์ ์ฉํ ๊ฒฝ์ฐ ํด๋น fn
์ฝ๋๋ ์คํ๋ const fn
์ ๋ถ์์ฉ์ ๊ด์ฐฐํฉ๋๋ค.
Haskell์์ ์์ ์ฝ๋์ ๋น์์ ์ฝ๋๋ฅผ ๊ตฌ๋ถํ๋ ์์ ์ "๋ถ์์ฉ์ด ์์ ๊ฒ์ธ๊ฐ"๋ฅผ ์ง์ญ์ ์ผ๋ก ๊ฒฐ์ ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ๋ค์๊ณผ ๊ฐ์ด ์ฃผ์ด์ง๋๋ค.
reverse :: [a] -> [a]
reverse [] = []
reverse (x : xs) = reverse xs ++ [x]
putStrLn :: String -> IO ()
getLine :: IO String
main :: IO ()
main = do
line <- getLine
let revLine = reverse line
putStrLn revLine
let revLine = reverse line
revLine
reverse
์ ์ ๋ฌ๋ ์ํ์๋ง ์์กดํ ์ ์์ผ๋ฉฐ ์ด๋ line
์
๋๋ค. ์ด๊ฒ์ ์ถ๋ก ์ด์ ๊ณผ ๊นจ๋ํ ๋ถ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋น์์ ํจ๊ณผ ์์คํ
์ด ์ด๋ ๋์ง ๊ถ๊ธํฉ๋๋ค... ์ด์จ๋ ๊น๋ํ๊ฒ ์ฒ๋ฆฌํ๊ณ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ค๋ฉด const fn
, async fn
๋ฑ์ด ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค. github.com/rust-lang/rfcs/pull/2237 ํ์ง๋ง ์ฝ๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๋ค...) ๋งค๊ฐ๋ณ์๋ ์ด์ ๋ํ ์ข์ ์๊ฐ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
ํ ์๋ค๋ฌ(Phil Wadler)์ ์ฝ๋ ๋งฅ๋ธ๋ผ์ด๋(Conor McBride)์ ๋ถํ์ ๋ช ์ธ:
๋๋ ์์ํด์ผํฉ๋๊น, ์๋๋ฉด ๋ถ์ ํด์ผํฉ๋๊น?
โํ๋ฆฝ ์๋ค๋ฌ [60]์ฐ๋ฆฌ๋ '์'๋ผ๊ณ ๋งํฉ๋๋ค. ์๋๋ ํ์ง์์ ์ ํํ๋ ๊ฒ์ ๋๋ค.
https://arxiv.org/pdf/1611.09259.pdf
@oli-obk
๋์ผํ ์ธ์๊ฐ ์ฃผ์ด์ง ๋ฐํ์ ๋๋ ์ปดํ์ผ ์๊ฐ์ ์คํ๋๋ ๊ฒฝ์ฐ ์คํ ๊ฒฐ๊ณผ๊ฐ const fn
์ ๋ํด ๋ค๋ฅผ ์ ์๋ค๋ ์ด ๋๋ผ์ด ๋์์ ๋ฌธ์ํํด์ผ ํ๋ ์ฌ๋์ด ๋ถ๋ฝ์ง ์์ต๋๋ค.
๋ณด์์ ์ธ ์ต์
์ผ๋ก const fn
๋ฅผ ์ฐธ์กฐ ํฌ๋ช
์ผ๋ก ์์ ํํ์ฌ ์ฐธ์กฐ ํฌ๋ช
์ฑ/์๋์ ๋ํ ๊ฒฐ์ ์ ์ฐ๊ธฐํ๊ณ unsafe
(๋๋ const
๊ฐ ์๋)๋ฅผ ์๋ฐํ๋๋ก ์ ์ํฉ๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ์ค์ ๋ก ์ฐธ์กฐ ํฌ๋ช
์ฑ์ ๋ณด์ฅํ์ง ์์ผ๋ฏ๋ก ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ๊ฐ์ ํ ์๋ ์์ต๋๋ค.
๋์ค์ ๊ฒฝํ์ ์์์ ๋ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ต๋๋ค.
๊ฒฝํ์ ์ป๋ ๊ฒ์๋ ์ฌ๋๋ค์ด ๋น๊ฒฐ์ ๋ก ์ ํ์ฉํ๋ ค ํ์ง๋ง ์คํจํ๊ณ , ์ด๋ฅผ ๋ณด๊ณ ํ๊ณ ๊ทธ๋ค์ ์ฌ์ฉ ์ฌ๋ก์ ๋ํด ์๋ ค์ฃผ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
์, ํ์ง๋ง ๊ทธ๊ฒ์ const ํ๊ฐ๊ฐ ์๋๋๋ค.
const์์ int๋ฅผ ptr๋ก ๋ณํํ๋ ๊ฒ์ ํฐ ์์ค์ฒ๋ผ ๋ณด์ด์ง ์์ต๋๋ค. ํ๋ ์คํ์ ์ ์ป๋ ๊ฒ์ด ๋ ์ค์ํด ๋ณด์ด๋ฉฐ ๊ทธ๊ฒ์ด ์ ๊ฐ ๋ณด์กดํ๋ ค๊ณ ํ๋ ๊ฒ์ ๋๋ค.
@SoniEx2 ํจ์์ const
๋ฅผ ์ถ๊ฐํ ๋ ๋์์ ์๋์ผ๋ก ๋ณ๊ฒฝํ๊ณ ์ถ์ง ์์ผ๋ฉฐ ์ด๊ฒ์ด ๋ณธ์ง์ ์ผ๋ก ๊ทํ์ ์ ์์ด ์ํํ๋ ์์
์
๋๋ค.
@centril ๋์ํฉ๋๋ค. ์ด์ ๋ณด์์ ์ธ ์ผ์ ํฉ์๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ด๊ฒ๋ค์ ์์ ํ์ง ์๊ฒ ๋ง๋ค์ง ์๊ณ ๋ถ์์ ํ๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ฐ ์์ผ๋ก libstd๊ฐ ์ฌ์ฉํ ์ ์์ง๋ง ์ธ๋ถ ์ฌํญ์ ๋์ค์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ํ ๊ฐ์ง ๋ฌธ์ ๋ ์ฌ์ฉ์๊ฐ ํญ์ ํตํฉ์ ๋์ ํ๊ณ ๋ฉ์ง ๋ณํ์ ์ํํ์ฌ ์ํํ๋ ๋ชจ๋ ๋ถ์์ ๋ฒฝ๋๋ก ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ์ฐํ ๋ณํ์ UB๋ก ๋ง๋ค์ด ๋์ค์ ๋ณ๊ฒฝํ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค.
๋ฐํ์์๋ ์ฌ์ ํ ๋์ผํ ๊ฒ์ด๊ณ , const๋ const ์๊ฐ์๋ง ๋ณ๊ฒฝํฉ๋๋ค. ์ด๋... const ์์ด๋ ํ ์ ์์ต๋๋ค.
const fns๊ฐ ๋ค๋ฅธ ํฌ์ธํฐ ์จ๋ฆฌ์ด์ฑ ๊ท์น์ ๊ฐ์ง ํ์ ์ธ์ด๊ฐ ๋๋ ๊ฒ์ ๊ด์ฐฎ์ต๋๋ค.
@Centril @est31 ํด๋ก๋ก ํธ๋ฆฌํ๋ฃจ์ค๋ก์ํธ๋ ์ด ๋ฌด์๊ณผ ๊ด๋ จ์ด ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@sgrif CTFE(์ปดํ์ผ ์๊ฐ ํจ์ ํ๊ฐ)๋ ์ค๋ซ๋์ Rust์ ์ฌ์ฉ๋์์ต๋๋ค(์ด ์ค๋ ๋์ ์ค๋๋ ๋ถ๋ถ ํฌํจ). ์ด๋ฏธ ์ค์ฌ ์ด๋๊ฐ์ ์ ์๋์ด์ผ ํ๋ ์ฉ์ด ์ค ํ๋์ ๋๋ค.
@sgrif lol ๋๋ถ๋ถ ์ฃ์กํฉ๋๋ค ์ ๋ "์ง๊ธ ์ด๋ค ์ด์ํ ๋จ์ด๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น?"๋ผ๊ณ ๊ถ๊ธํดํ๋ ์ฌ๋์ ๋๋ค. IRC์์ @eddyb ๊ฐ "CTFE"๋ฅผ ์ธ๊ธํ์ ๋ ๋๋ ๊ทธ์๊ฒ ๊ทธ๊ฒ์ด ๋ฌด์์ ์๋ฏธํ๋์ง ๋ฌผ์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.p.
์ด ํ์ด์ง์ @eddyb ctrl+f + CTFE๋ ์ด๋ฅผ ์ ์ํ๋ ๊ฒ์ผ๋ก ์ด์ด์ง์ง ์์ต๋๋ค. ์ด๋ ์ชฝ์ด๋ , ๋๋ ์ฐ๋ฆฌ๊ฐ ์ฌ๋๋ค์๊ฒ ์ฌ๊ธฐ ํ ๋ก ์ ์ฐธ์ฌํ๊ธฐ ์ํด ๋ง์ ์กฐ์ฌ๋ฅผ ํ๋๋ก ๊ฐ์ํ๊ณ ์ถ์ง ์๋ค๋ ๊ฐ์ ํ์ ์ฃผ๋ก ์งํํ๊ณ ์์ต๋๋ค. "์ด๊ฒ์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ์ด๋ฏธ ์๊ณ ์์ด์ผ ํฉ๋๋ค"๋ ์๋นํ ๋ฐฐ์ ์ ์ธ IMO์ ๋๋ค.
@Centril @est31 ๊ฐ์ฌํฉ๋๋ค :heart:
๊ทธ๋์...์ ๋ํ ์ด๋ค ์๊ฐ
์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ํ ๊ฐ์ง ๋ฌธ์ ๋ ์ฌ์ฉ์๊ฐ ํญ์ ํตํฉ์ ๋์ ํ๊ณ ๋ฉ์ง ๋ณํ์ ์ํํ์ฌ ์ํํ๋ ๋ชจ๋ ๋ถ์์ ๋ฒฝ๋๋ก ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ด๋ฌํ ์ฐํ ๋ณํ์ UB๋ก ๋ง๋ค์ด ๋์ค์ ๋ณ๊ฒฝํ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ const fn ๋ด๋ถ์ ๊ณต์ฉ์ฒด ํ๋ ์ก์ธ์ค๋ ๋ถ์์ ํด์ผ ํฉ๋๊น?
์ด ํ์ด์ง์ ctrl+f + CTFE๋ ์ด๋ฅผ ์ ์ํ๋ ๊ฒ์ผ๋ก ์ด์ด์ง์ง ์์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ์ ๊ฐ ์๋ฏธํ๋ ๋ฐ๋ Rust์ ๋์์ธ ๋ฐ ๊ฐ๋ฐ์์ ์ด 1.0 ์ด์ ๋ฌธ์ ๋ณด๋ค ๋จผ์ ์ฌ์ฉ๋์๋ค๋ ๊ฒ์
๋๋ค.
์ด๋ฌํ ์ฉ์ด์ ๋ํ ์ค์ฌ ๋ฌธ์๊ฐ ์์ด์ผ ํ์ง๋ง ์ฌํ๊ฒ๋ ์ฐธ์กฐ์ ์ฉ์ด์ง ์ด ์ ๋ง ๋ถ์กฑํฉ๋๋ค.
HRTB ๋ฐ NLL์ ๋ ์ต์ ์ด์ง๋ง ์ธ๋ผ์ธ์ผ๋ก ์ค๋ช
๋์ง ์๋ ๋ค๋ฅธ ์ฝ์ด์ ๋ ๊ฐ์ง ์์
๋๋ค.
๋๋ ์ด๋ค ํ ๋ก ๋ ๋ฐฐ์ ๋๋ ๊ฒ์ ์ํ์ง ์์ง๋ง @Centril ์ด๋ @est31 ์๊ฒ CTFE๋ฅผ ์ ์ํ๋๋ก ์์ฒญํ๋ ๊ฒ์ ๊ณตํํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ ๋ค ์ ์ด์ ๋๋ฌธ์์ด๋ฅผ ๋์
ํ์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฌํ๊ฒ๋ GitHub์์ ๋ฐ๋์ ์๋ํ์ง ์๋ ์๋ฃจ์
์ด ์์ต๋๋ค. ํน์ ํ์ ๋ ๋ง์์ ๋ณธ ์ ์ด ์์ต๋๋ค. ๋ด์ด ์ต์์ ์ฃผ์์ ์์ฑํ๊ณ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ชจ๋ ์ฝ์ด์ ๋ํ ํ์ฅ ๋ชฉ๋ก๊ณผ ํจ๊ป ์
๋ฐ์ดํธ๋ ์ํ๋ก ์ ์งํฉ๋๋ค . ํ ๋ก ์ ํ์๋๋ ํ์ ๋ ๋ง.
๋ํ CTFE์ ๋ํ ๋ ๊ฐ์ ์ํคํผ๋์ ๊ธฐ์ฌ("ํด๋ก๋กํธ๋ฆฌํ๋ฃจ์ค๋ก์ํธ๋ " ๋ฐ "์ปดํ์ผ ์๊ฐ ํจ์ ์คํ")๊ฐ ์ฒ์ ๋ ๊ฐ์ ๊ฒฐ๊ณผ์ด๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ Google ๋ฒ๋ธ์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. ๊ทธ๋๋ ์ ์๋ "์ปดํ์ผ๋ฌ ๊ธฐ๋ฅ์ ๋ํด์๋ ์ปดํ์ผ ํ์ ํจ์ ์คํ์ ์ฐธ์กฐํ์ญ์์ค."๋ก ์์ํฉ๋๋ค.
( ๋งจ ์์ CTFE ์ํค ๋งํฌ๋ฅผ ๋ฃ์์ต๋๋ค. ์ด์ const fn
s๋ก ๋์๊ฐ ์ ์์ต๋๊น? :P)
๋๊ตฐ๊ฐ๊ฐ Rustc ๊ฐ์ด๋ ์ฉ์ด์ง์ CTFE๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๊น(์ ๋ ๋ชจ๋ฐ์ผ์ ๋๋ค)?
๋ํ ์ต์๊ฐ์ ์์ ํํ๊ณ ์ฌ๋๋ค์ด ์ค์ ๋ก ๋ง์ด ๋ถ๋ชํ๋ ๊ฒ์ ํ์ธํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. const if ๋ฐ match ์์ ์ฌ์ฉํ์ฌ ํ์ฌ ์ ๊ทผ ๋ฐฉ์์ผ๋ก ๋ณด๋ด๋ ๊ฒ์ ๋๋ค.
@์ผํธ๋ฆด
๋์ผํ ์ธ์๊ฐ ์ฃผ์ด์ง ๋ฐํ์ ๋๋ ์ปดํ์ผ ํ์์ ์คํ๋๋ ๊ฒฝ์ฐ ์คํ ๊ฒฐ๊ณผ๊ฐ const fn์ ๋ํด ๋ค๋ฅผ ์ ์๋ค๋ ์ด ๋๋ผ์ด ๋์์ ๋ฌธ์ํํด์ผ ํ๋ ์ฌ๋์ด ๋ถ๋ฝ์ง ์์ต๋๋ค.
์์์ ์์ฑํ even
๋ ํฌ์ธํฐ์ ๋นํธ๋ฅผ ๊ฒ์ฌํ๊ธฐ ๋๋ฌธ์ CTFE ์๊ฐ์ ์คํํ๋ฉด ์คํจํฉ๋๋ค. (์ค์ ๋ก ์ฐ๋ฆฌ๋ ์ด๊ฒ์ด ์ฌ์ง์ด ์ ๋ ฌ ๋๋ฌธ์ด๋ผ๊ณ ๊ฒฐ์ ๋ก ์ ์ผ๋ก ๋งํ ์ ์์ง๋ง, ๊ท ์ผ์ฑ ํ
์คํธ๊ฐ ๋นํธ ์ฐ์ฐ์ ํตํด ์ํ๋๋ค๋ฉด "full miri"๊ฐ ์ ์ ํ๊ฒ ์ํํ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์ ์ฒด ์ตํ์ ๋ฐ์ดํธ๋ฅผ ํ
์คํธํ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. ๋ง์ง๋ง ๋นํธ.)
์ฌ๊ธฐ์ ๋งํ๋ ๊ฒฝ์ฐ๋ ์ปดํ์ผ ํ์์๋ ์ธํฐํ๋ฆฌํฐ ์ค๋ฅ๋ก ์ค๋ฅ ๊ฐ ๋ฐ์ํ์ง๋ง ๋ฐํ์์๋ ์ฑ๊ณตํ๋ ํจ์์
๋๋ค. ์ฐจ์ด์ ์ ํจ์๊ฐ ์คํ์ ์๋ฃํ๋์ง ์ฌ๋ถ์
๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ์ค๋ช
ํ๊ธฐ ์ด๋ ต๋ค๊ณ ์๊ฐํ์ง ์๋๋ค.
CTFE๊ฐ ๊ฒฐ๊ณผ๋ก ์ฑ๊ณตํ๋ฉด ํจ์์ ๋ฐํ์ ๋ฒ์ ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ก ์ฑ๊ณตํ๋๋ก ๋ณด์ฅ๋์ด์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋งํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ฝํ ๋ณด์ฆ์ ๋๋ค. ๊ทธ๋ ์ง ์์ต๋๊น?
@oli-obk
๋์ํฉ๋๋ค. ์ด์ ๋ณด์์ ์ธ ์ผ์ ํฉ์๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ด๊ฒ๋ค์ ์์ ํ์ง ์๊ฒ ๋ง๋ค์ง ์๊ณ ๋ถ์์ ํ๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ฐ ์์ผ๋ก libstd๊ฐ ์ฌ์ฉํ ์ ์์ง๋ง ์ธ๋ถ ์ฌํญ์ ๋์ค์ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
๋งฅ๋ฝ์ ์์์ต๋๋ค. ์ฌ๊ธฐ์ "์ด๊ฒ๋ค"์ ๋ฌด์์ ๋๊น?
ํ์ฌ ์ด ์ข๊ฒ๋ CTFE ๋ฏธ๋ฆฌ๋ ์ฐ์ , ๋น๊ต, ๋ชจ๋ ์ค๋ฅ์ ๊ฐ์ ํฌ์ธํฐ ๊ฐ์ ๋ํ ์์ ์ ์์ ํ ๊ฑฐ๋ถํฉ๋๋ค. ์ด๊ฒ์ ๊ณ์ฐ์ ์ค์ ๋ก ์ฌ์ฉ๋ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก CTFE ์๊ฐ์ ์ํ๋ ๊ฒ์ฌ์ด๋ฉฐ, ํฉ์งํฉ์ผ๋ก ์ฐํํ ์ ์์ผ๋ฉฐ ์ด์จ๋ ์ฐ์ /๋น๊ต๋ฅผ ์ํํ๋ ๋ฐ ํ์ํ ์ฝ๋ ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค . ๋ฐ๋ผ์ ์์์ ์ธ๊ธํ ๋ณด์ฆ์ ์ถฉ์กฑํ๋ค๊ณ ํ์ ํฉ๋๋ค.
CTFE๊ฐ ํฌ์ธํฐ ๊ฐ์ ๋ฐํํ๋๋ก ํ๋ฉด ๋ฌธ์ ๋ฅผ ์์ํ ์ ์์ง๋ง ์ปดํ์ผ ์๊ฐ์ ๊ณ์ฐ๋ ํฌ์ธํฐ ๊ฐ์ด ์ด๋์์๋ ์๋ฏธ๊ฐ ์์๊น์? ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๋นํธ๋ก ๋ณํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํฌ์ธํฐ ๊ฐ์ ํฌํจํ์ง ์๋๋ก ๊ณ์ฐํ๋ ๋ชจ๋ ๊ฒ์ ์ด๋ฏธ ํ์ธํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์กฐ์ฌ์ค๋ฝ๊ฒ CTFE miri์ ์ฐ์ฐ์ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ, ์ฌ์ค @eddyb ์ offset_of [1]์ ํ์ํ ๊ฒ์ ํฌ์ธํฐ ๋นผ๊ธฐ์
๋๋ค. ๊ทธ ์ฝ๋๋ "full miri"์ ์กด์ฌํ๋ฉฐ ๋ ํฌ์ธํฐ๊ฐ ๋์ผํ ํ ๋น ๋ด์ ์๋ ๊ฒฝ์ฐ์๋ง ์ฑ๊ณตํฉ๋๋ค. ์ด๋ ์์ ๋ณด์ฆ์ ์ ์งํ๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค. ์๋ํ์ง ์๋ ๊ฒ์ @eddyb ๊ฐ ๋ณดํธ ์ฅ์น๋ก ์ถ๊ฐํ assert
์
๋๋ค.
์์
์ด ํฌ์ธํฐ์ ์ ๋ ฌ๋ ๋ถ๋ถ์๋ง ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ ํฌ์ธํฐ ๊ฐ์ ๋ํ ๋นํธ ์์
์ ํ์ฉํ ์๋ ์์ต๋๋ค. ์ฌ์ ํ ๊ฒฐ์ ์ ์ด๋ฉฐ ์ฝ๋๊ฐ ์ค์ ๋ก "์ ์ฒด ๋ฏธ๋ฆฌ"์ ์กด์ฌํฉ๋๋ค.
ํธ์ง: [1] ์ฐธ๊ณ ๋ก, ์ด ์ค๋ ๋ ์์ ์ฃผ์ ์์ ๋ฒ์ด๋ ๊ฒ์ผ๋ก ํ์๋์ด ๋งํฌํ ์ ์๋ ๊ทธ์ ๋งคํฌ๋ก๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก ์ฌ๊ธฐ์ ์ฌ๋ณธ์ด ์์ต๋๋ค.
macro_rules! offset_of {
($Struct:path, $field:ident) => ({
// Using a separate function to minimize unhygienic hazards
// (e.g. unsafety of #[repr(packed)] field borrows).
// Uncomment `const` when `const fn`s can juggle pointers.
/*const*/ fn offset() -> usize {
let u = $crate::mem::MaybeUninit::<$Struct>::uninit();
// Use pattern-matching to avoid accidentally going through Deref.
let &$Struct { $field: ref f, .. } = unsafe { &*u.as_ptr() };
let o = (f as *const _ as usize).wrapping_sub(&u as *const _ as usize);
// Triple check that we are within `u` still.
assert!((0..=$crate::mem::size_of_val(&u)).contains(&o));
o
}
offset()
})
}
EDIT2: ์ฌ์ค, ๊ทธ๋ ๋ํ ๊ทธ๊ฒ์ ์ฌ๊ธฐ ์ ๊ฒ์ํ์ต๋๋ค.
"์ด๊ฒ๋ค"์ float -> ๋นํธ ๋ณํ ๋ฐ ํฌ์ธํฐ -> ๋ณํ ์ฌ์ฉ์ ๋๋ค.
CTFE๊ฐ ๊ฒฐ๊ณผ๋ก ์ฑ๊ณตํ๋ฉด ํจ์์ ๋ฐํ์ ๋ฒ์ ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ก ์ฑ๊ณตํ๋๋ก ๋ณด์ฅ๋์ด์ผ ํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋งํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์ฝํ ๋ณด์ฆ์ ๋๋ค. ๊ทธ๋ ์ง ์์ต๋๊น?
๋ฐ๋ผ์ ๋ฐํ์์ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถ๋ ํจ์๋ ๋์ผํ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผ ์๊ฐ์ ํ๊ฐ๋๋ ๊ฒฝ์ฐ ์ค์ ๋ก ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ์๋ง ์๋๊ฐ ๋ณด์ฅ๋ฉ๋๊น?
๊ทธ๋ ๊ฒ ํ๋ฉด ์ฐ๋ฆฌ์ ์ถ์ด ๋ฐฑ๋ง ๋ฐฐ ๋ ์ฌ์์ง ๊ฒ์ ๋๋ค. ํนํ ํ์ ์ ๋จ๊ธฐ๊ฑฐ๋ ํ๊ธฐ์ ์ธ ๋ฐฉ์์ผ๋ก const fn์ ์์์ํค์ง ์๊ณ ๋น๊ฒฐ์ ๋ก ์ ๋ฐฉ์งํ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ๋ผ์ ๋ฐํ์์ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถ๋ ํจ์๋ ๋์ผํ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผ ์๊ฐ์ ํ๊ฐ๋๋ ๊ฒฝ์ฐ ์ค์ ๋ก ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ์๋ง ์๋๊ฐ ๋ณด์ฅ๋ฉ๋๊น?
์, ๊ทธ๊ฒ์ด ์ ๊ฐ ์ ์ํ๋ ๊ฒ์ ๋๋ค.
์ข ๋ ์๊ฐํด๋ณด๋ฉด(๊ทธ๋ฆฌ๊ณ ์ด ๊ธ์ ์ฐ๋ ๋์ @oli- obk ์ ๋ต์ฅ์ ์ฝ์ผ๋ฉด์) "์์ ํ const fn
๋ ๋ค์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ ๊ฒ์
๋๋ค. ์ ํจํ ์ธ์์ ํจ๊ป ํธ์ถ๋ ๋ CTFE ์๊ฐ(ํจ๋ ์ ์ธ)". ์ผ์ข
์ "const ์์ " ๋ณด์ฅ. ๋ฐํ์ ๋์๊ณผ ์ผ์นํ๋ ์ฑ๊ณต์ ์ธ CTFE์ ๋ํด ์์์ ์ธ๊ธํ ๋ณด์ฅ๊ณผ ํจ๊ป ์์ ํ const fn
๊ฐ ์ฑ๊ณต์ ์ธ CTFE ์คํ๊ณผ ์ผ์นํ๊ธฐ ๋๋ฌธ์ ๋ฐํ์์ ๊ฒฐ์ ์ ์ด๋ผ๋ ๋ณด์ฅ์ ์ ๊ณตํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ป๊ธฐ ์ด๋ ค์ด ๋ณด์ฆ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ์ข๋ ๋์๋ Rust๋ CTFE miri๊ฐ ๊ฒฐ์ ๋ก ์ ์ ์งํ๋ฉด์ ํญ์ ์ฑ๊ณต์ ์ผ๋ก ์คํํ๋ค๊ณ ๋ณด์ฅํ ์ ์๋ ๋ค์ํ ์์ ํ ์ฐ์ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด @Centril ์ oracle
๋ณ์ข
์ ์ตํ์ ๋ฐ์ดํธ๊ฐ 0์ธ์ง ํ
์คํธํฉ๋๋ค. ๊ด์ ์์ ์ด ์ค์ ์์ CTFE์ "์ ํจํ ๊ฐ usize
"์ PrimVal::Bytes
์ธ ๊ฐ๋ง ๊ตฌ์ฑํ๋ ๋ฐ๋ฉด PrimVal::Ptr
๋ ํ์ฉ๋์ง ์์์ผ ํฉ๋๋ค[1]. const ์ปจํ
์คํธ์์ ์ฝ๊ฐ ๋ค๋ฅธ ์ ํ ์์คํ
์ด ์๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ์ ๋ miri๊ฐ ํ๋ ์ผ์ ๋ณ๊ฒฝํ ๊ฒ์ ์ ์ํ๋ ๊ฒ์ด ์๋๋ผ const fn
์ ์ฒจ๋ถ๋ ๋ ๋ค์ํ Rust ์ ํ์ด "์๋ฏธ"ํ๋ ๊ฒ์ ๋ณ๊ฒฝํ ๊ฒ์ ์ ์ํฉ๋๋ค. ์ด๋ฌํ ์ ํ ์์คํ
์ CTFE์์ ๋ชจ๋ ์์ ํ ์ฐ์ ๋ฐ ๋นํธ ์ฐ์ฐ์ด ์๋ชป๋ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค. CTFE ์ ํจ ์
๋ ฅ์ ๊ฒฝ์ฐ ์์ชฝ์ด PrimVal::Bytes
์ด๋ฏ๋ก CTFE์์ ์ ์ ๋นผ๊ธฐ๊ฐ ์คํจํ ์ ์์ต๋๋ค. ๋ฌผ๋ก , ptr-to-int๋ ๋ฐํ ๊ฐ์ ์ ํ์ด usize
์ด์ง๋ง CTFE ์ ํจ usize
๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์ด ์ค์ ์์ ์์ ํ์ง ์์ ์์
์ด์ด์ผ ํฉ๋๋ค.
์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ ๊ฒฝ์ ์ฐ๋ ๋ณด์ฆ์ด๋ผ๋ฉด CTFE ๊ธฐ๋ฅ์ ํ์ธํ ๋ ์ ํ ์์คํ
์ ๋ ์๊ฒฉํ๊ฒ ๋ง๋๋ ๊ฒ์ด ๋ฌด๋ฆฌ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฒฐ๊ตญ, ์ฐ๋ฆฌ๋ ๋ ๋ง์ ์ผ์ ํ๊ธฐ ์ํด ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํฉ๋๋ค("const ์์ " ํ์ธ). unsafe
const
์ปจํ
์คํธ์์ const
์ปจํ
์คํธ๊ฐ ์ถ๊ฐ ๋ณด์ฅ.
์ฐ๋ฆฌ์ ์ผ๋ฐ์ ์ธ "๋ฐํ์ ์์ "์ด ์์ ํ์ง ์์ ์ฝ๋์ ์ํด ์ ๋ณต๋ ์ ์๋ ๊ฒ์ฒ๋ผ "const ์์ "๋ ์ ๋ณต๋ ์ ์์ผ๋ฉฐ ๊ด์ฐฎ์ต๋๋ค. ๋๋ ์์ ํ์ง ์์ ์ฝ๋๊ฐ ์ฌ์ ํ ๊ณต์ฉ์ฒด๋ฅผ ํตํด ptr-to-int ์บ์คํธ๋ฅผ ์ํํ ์ ์๋ค๋ ๋ฌธ์ ๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค. ๊ฒฐ๊ตญ ์์ ํ์ง ์์ ์ฝ๋ ์
๋๋ค. ์ด ์ธ์์์ const ์ปจํ
์คํธ์ ์์ ํ์ง ์์ ์ฝ๋์ ๋ํ ์ฆ๋ช
์๋ฌด๋ ๋น const ์ปจํ
์คํธ์ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋ ฅํฉ๋๋ค. ํจ์๊ฐ ์ ์๋ฅผ ๋ฐํํ๋ฉด ์ด๊ฒ์ด ํญ์ PrimVal::Bytes
์ด๊ณ PrimVal::Ptr
๊ฐ ์๋์ ์ฆ๋ช
ํด์ผ ํฉ๋๋ค.
@eddyb ์ ๋งคํฌ๋ก์๋ ์์ ํ์ง ์์ ๋ธ๋ก์ด ํ์ํ์ง๋ง ์ด๋ฌํ "const unsafe ๊ธฐ๋ฅ"(ptr-to-usize ํ ๊ฒฐ๊ณผ ๋นผ๊ธฐ ๋๋ ํฌ์ธํฐ ๋นผ๊ธฐ ๋ด์ฅ ํจ์ ์ฌ์ฉ)๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฌ์ ํ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค. ์ง์ ) CTFE ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ๋ณด์ฅํ๋ ๋ฐฉ์์ผ๋ก.
์ด๋ฌํ ์์คํ
์ ๋น์ฉ์ ์์ ํ ๊ณ ์ฐจ const fn
๊ฐ const fn
ํด๋ก์ ๋ฅผ ๊ฐ์ ธ์์ผ ํด๋ก์ ์คํ ์์ฒด๊ฐ "const ์์ "์ ์๋ฐํ์ง ์๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ด ์ค์ ๋ก ์์ ํ const fn
์ ๋ํ ์ ์ ํ ๋ณด์ฆ์ ์ป๋ ๋๊ฐ์
๋๋ค.
[1] ๋น๊ฒฐ์ ๋ก ์ด ์ด๋์์ ๋ฐ์ํ๋์ง ์ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์์ float๋ฅผ ์์ ํ ๋ฌด์ํฉ๋๋ค. CTFE ์๊ฐ๊ณผ ๋ฐํ์์ ๋ค๋ฅด๊ฒ ๋์ํ๋ ๋ถ๋ ์์์ ์ฝ๋์ ๋ํ ์๋ฅผ ๋๊ตฐ๊ฐ ์ ๊ณตํ ์ ์์ต๋๊น? ์๋ฅผ ๋ค์ด ๋ถ๋ ์์์ ์ฐ์ฐ์ ์ํํ ๋ ํผ์ฐ์ฐ์ ์ค ํ๋๊ฐ ์ ํธ NaN(์ฒซ ๋ฒ์งธ ๋ณด์ฆ์ ์ป๊ธฐ ์ํด ์ด์ ๊ฒ์๋ฌผ์์ ๊ฐ์ ธ์จ ๊ฒ)์ธ ๊ฒฝ์ฐ miri ์ค๋ฅ๋ฅผ ๋ด๋ณด๋ด๊ณ CTFE ์ ํ ์์คํ
์ด f32
/ f64
์ ํ์์ NaN ์ ํธ๋ฅผ ํ์ฉํ์ง ์์ต๋๊น("const ์์ "์ ์ป๊ธฐ ์ํด)?
์๋ํ์ง ์๋ ๊ฒ์ @eddyb ๊ฐ ๋ณดํธ ์ฅ์น๋ก ์ถ๊ฐํ ์ฃผ์ฅ์ ๋๋ค.
๋ฌผ๋ก ์
๋๋ค. ํ์ง๋ง ์ง๊ธ์ assert!(condition);
๋ฅผ [()][!condition as usize];
๋ก ๋ค์ ์ธ ์ ์์ต๋๋ค.
๋ฌผ๋ก ๋ค์ ์์ฑํ ์ ์์ต๋๋ค. assert!(condition); [()][!์กฐ๊ฑด์ ์ฌ์ฉ]์ผ๋ก; ์ง๊ธ์.
๊ทธ๊ฒ์ ๋ด๊ฐ ์๊ฐํ ์ฃผ์ฅ์ด ์๋๋ผ ๊ทํ์ ์กฐ๊ฑด์์ ํฌ์ธํฐ ํ๋ฑ ํ ์คํธ์ ๋๋ค. ํฌ์ธํฐ ํ๋ฑ์ ์ ์ด๋ฉฐ CTFE์์ ํ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํธ์ง: ์ ๊ฒฝ ์ฐ์ง ๋ง์ธ์. ๋ฐฉ๊ธ assert
์ด ์คํ์
์ ํ
์คํธํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค. ๋ฐ๋ผ์ wrapping_sub
๋ฅผ ์ํํ ๋ ํฌ์ธํฐ๊ฐ ๋์ผํ ๋ธ๋ก์ ์์ง ์์ผ๋ฉด miri๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก CTFE ์๊ฐ์ ์คํจํ ์ ์์ต๋๋ค.
// guess we can't have this as const fn
fn is_eq<T>(a: &T, b: &T) -> bool {
a as *const _ == b as *const _
}
์ ์ ๋งํ๋ฏ์ด ์ค์ ํฌ์ธํฐ๊ฐ ์๋ ๋ฏธ๋ฆฌ์์ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ญ์์ค. const ์๊ฐ์ const ๊ฒฐ์ ์ฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ํจ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์์ฑ๋๋ฉด ๋ฐํ์๊ณผ ์ปดํ์ผ ์๊ฐ ๋์์ ๋ฐํ์์ด ๋น๊ฒฐ์ ์ ์ด์ง๋ง ์ปดํ์ผ ์๊ฐ์ด ๊ฒฐ์ ์ ์ธ์ง ์ฌ๋ถ์ ๊ด๊ณ์์ด ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋น๊ฒฐ์ ์ ํ๊ฒฝ์์ ๊ฒฐ์ ์ ๋์์ ํ ์ ์์ต๋๋ค.
ํ๋ ์คํ์ ์ ์ป๋ ๊ฒ์ ๊ฒฐ์ ์ ์ ๋๋ค. ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฐ์ ์ ์ผ๋ก ์ ์ง๋ฉ๋๋ค. ์ค์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ ํ ๊ฒฐ์ ์ ์ ๋๋ค.
ํฌ์ธํฐ์ 14๋ฒ์งธ ๋นํธ์ ์ง์๋ฅผ ์ป๋ ๊ฒ์ ๊ฒฐ์ ์ ์ด์ง ์์ต๋๋ค. ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฐ์ ์ ์ด ๋ฉ๋๋ค. ์ค์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฐ์ ์ ์ด์ง ์์ต๋๋ค. ํ๋๋ ์ปดํ์ผ ํ์(๊ฒฐ์ ์ ํ๊ฒฝ)์ ๋ฐ์ํ๊ณ ๋ค๋ฅธ ํ๋๋ ๋ฐํ์(๋น๊ฒฐ์ ์ ํ๊ฒฝ)์ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๊ด์ฐฎ์ต๋๋ค.
const fn์ ์ฌ์ฉ ์ค์ธ ํ๊ฒฝ๋งํผ ๊ฒฐ์ ์ ์ด์ด์ผ ํฉ๋๋ค.
@SoniEx2
// guess we can't have this as const fn
์ค์ ๋ก ์ฐ๋ฆฌ๋ ํ ์ ์์ต๋๋ค. ๋ ํฌ์ธํฐ ์ค ํ๋๊ฐ ํ ๋น๋ ๊ฐ์ฒด ๋ด์ ์๋ค๋ ์๋ฏธ์์ ํ์ฌ ์ญ์ฐธ์กฐํ ์ ์๋ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์์ ํฌ์ธํฐ ๋น๊ต ๋ฒ์ ์ผ๋ก ์ด ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค(๊ทธ๋ฌ๋ "์ ์ฒด ๋ฏธ๋ฆฌ"๊ฐ ํ์ฌ ๊ตฌํํ๋ ๊ฒ์ ์๋). ๊ทธ๋ฌ๋ T
์ ํฌ๊ธฐ๊ฐ 0์ด๋ฉด ์์ ํ ์ฝ๋๋ง ๊ณ ๋ คํ๋๋ผ๋ ๊ฐ์ฒด์ ๋์ ์ง๋ ํ๋๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๊ธฐ ๋๋ฌธ์ is_eq
๋ "const safe"๊ฐ ์๋๋๋ค.
C++์์๋ ๋์ ์ง๋ ํ ํฌ์ธํฐ๋ฅผ ๋น๊ตํ์ฌ ๋ถํ์คํ(๋น๊ฒฐ์ ์ ) ๊ฒฐ๊ณผ๋ฅผ ์ฐ์ถํ ์ ์์ต๋๋ค. C์ C++ ๋ชจ๋ ๋๊ธ๋ง ํฌ์ธํฐ๋ฅผ ๋น๊ตํ์ฌ ๋ถํ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ฐ์ถํ ์ ์์ต๋๋ค. LLVM์ด ๋ฌด์์ ๋ณด์ฅํ๋์ง ๋ช ํํ์ง ์์ง๋ง C/C++์ ๋ํด ๋ณด์ฅํด์ผ ํ๋ ๊ฒ(๋ ์ค ๋ ์ฝํ ๊ฒฝ์ฐ)์ ์ด๊ณผํ๋ ๋ณด์ฅ์ ๋ด๊ธฐ๋ฅผ ๊ฑธ์ง๋ ์์ต๋๋ค. ์ด๊ฒ์ CTFE์์ ์ฑ๊ณต์ ์ผ๋ก ์คํ๋๋ ๋ชจ๋ ๊ฒ์ ๋ํ ๋ฐํ์ ๊ฒฐ์ ์ฑ์ ๋ณด์ฅํ๋ ค๋ ๊ฒฝ์ฐ ๋ฌธ์ ์ ๋๋ค.
@RalfJung
์ฐจ์ด์ ์ ํจ์๊ฐ ์คํ์ ์๋ฃํ๋์ง ์ฌ๋ถ์ ๋๋ค.
์ ๋ง ์นํธ์: "๋ฐํ โฅ" ์ ํ ๊ฒฝ์ฐ์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ค๋ช ํ๊ธฐ ์ด๋ ต๋ค๊ณ ์๊ฐํ์ง ์๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๋๋ ๊ทธ๊ฒ์ ๋๋ผ์ด ํ๋์ผ๋ก ๋ด ๋๋ค. ์ค๋ช ์ ํด์ฃผ์๋ฉด ์ดํด๊ฐ ๋๊ฒ ์ง๋ง(๋ํ๋ ์๋์ง๋ง...) ์ ์ง๊ฐ์๋ ๋ง์ง ์์ต๋๋ค.
@oli-obk
๋ฐ๋ผ์ ๋ฐํ์์ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ํธ์ถ๋ ํจ์๋ ๋์ผํ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผ ์๊ฐ์ ํ๊ฐ๋๋ ๊ฒฝ์ฐ ์ค์ ๋ก ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ์๋ง ์๋๊ฐ ๋ณด์ฅ๋ฉ๋๊น?
๊ฐ์ธ์ ์ผ๋ก ์ด ๋ณด์ฆ์ด ์ถฉ๋ถํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ์๋๋ฅผ ๊ฐ์ง๊ณ ์ด๋๊น์ง ๊ฐ ์ ์๋์ง ๋จผ์ ๋ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ด ์ค์ ๋ก ๋ง๋น๋๊ณ ์๋ค๋ ๊ฒ์ ์์์ ๋๋ง ๋ ์ฝํ ๋ณด์ฆ์ผ๋ก ๋์๊ฐ์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@RalfJung
์ด๋ ์์ ํ const fn์ด ์ฑ๊ณต์ ์ธ CTFE ์คํ๊ณผ ์ผ์นํ๊ธฐ ๋๋ฌธ์ ๋ฐํ์์ ๊ฒฐ์ ์ ์์ ๋ณด์ฅํฉ๋๋ค.
์ข์์; ๋น์ ์ ๋๋ฅผ ์์๋ค; ๋ ์ ์ ๊ฐ ์ฃผ์ด์ง๋ฉด ์ด "safe const fn is deterministic" ๋ณด์ฅ์ ์ด๋ป๊ฒ ๋๋ฌํ๋์ง ์ ์ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ฅผ ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ ๊ฒฝ์ ์ฐ๋ ๋ณด์ฆ์ด๋ผ๋ฉด CTFE ๊ธฐ๋ฅ์ ํ์ธํ ๋ ์ ํ ์์คํ ์ ๋ ์๊ฒฉํ๊ฒ ๋ง๋๋ ๊ฒ์ด ๋ฌด๋ฆฌ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ฒฐ๊ตญ, ์ฐ๋ฆฌ๋ ๋ ๋ง์ ์ผ์ ํ๊ธฐ ์ํด ๊ทธ๊ฒ์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํฉ๋๋ค("const ์์ " ํ์ธ). ๊ทธ๋ ๋ค๋ฉด const ์ปจํ ์คํธ๊ฐ ์ถ๊ฐ ๋ณด์ฅ์ ํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ํ์ํ๋ค๊ณ ์ฃผ์ฅํ๋ฉด์ ptr-to-int ์บ์คํธ๋ฅผ const ์ปจํ ์คํธ์์ ์์ ํ์ง ์๋ค๊ณ ์ ์ธํ๋ ๊ฒ์ด ๋งค์ฐ ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ฐ๋ฆฌ์ ์ผ๋ฐ์ ์ธ "๋ฐํ์ ์์ "์ด ์์ ํ์ง ์์ ์ฝ๋์ ์ํด ์ ๋ณต๋ ์ ์๋ ๊ฒ์ฒ๋ผ "const ์์ "๋ ์ ๋ณต๋ ์ ์์ผ๋ฉฐ ๊ด์ฐฎ์ต๋๋ค. ๋๋ ์์ ํ์ง ์์ ์ฝ๋๊ฐ ์ฌ์ ํ ๊ณต์ฉ์ฒด๋ฅผ ํตํด ptr-to-int ์บ์คํธ๋ฅผ ์ํํ ์ ์๋ค๋ ๋ฌธ์ ๋ฅผ ๋ณด์ง ๋ชปํ์ต๋๋ค. ๊ฒฐ๊ตญ ์์ ํ์ง ์์ ์ฝ๋์ ๋๋ค. ์ด ์ธ์์์ const ์ปจํ ์คํธ์ ์์ ํ์ง ์์ ์ฝ๋์ ๋ํ ์ฆ๋ช ์๋ฌด๋ ๋น const ์ปจํ ์คํธ์ ๊ฒ๋ณด๋ค ๋ ๊ฐ๋ ฅํฉ๋๋ค. ํจ์๊ฐ ์ ์๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ ์ด๊ฒ์ด ํญ์
PrimVal::Bytes
์ด๊ณPrimVal::Ptr
๊ฐ ์๋์ ์ฆ๋ช ํด์ผ ํฉ๋๋ค.
์ด ๋จ๋ฝ์ ๋ด ๊ท์ ์์ ์ ๋๋ค! โค๏ธ ์ด๊ฒ์ ๊ฒฐ์ ๋ก ("์๋")์ ๋ณด์ฅํ๋ ๊ฒ ๊ฐ์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ ํํ ๋ด๊ฐ ์ด์ ์ ์ผ๋์ ๋์๋ ๊ฒ์ ๋๋ค. ๋๋ const ์์ ๋ ํ๋ฅญํ ์ฉ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค!
๋์ค์ ์ฐธ์กฐํ ์ ์๋๋ก ์ด ๋ณด์ฆ์ "CTFE ๊ฑด์ ์ฑ"์ด๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค. CTFE์ ์ค๋ฅ๊ฐ ์์ผ๋ฉด ๋์์ด ๋ฐํ์๊ณผ ์ผ์นํฉ๋๋ค. ๋ ๋ค ๋ฐ์ฐํ๊ฑฐ๋ ๋ ๋ค ๋์ผํ ๊ฐ์ผ๋ก ์ข ๋ฃ๋ฉ๋๋ค. (์ฌ๊ธฐ์ ๊ณ ์ฐจ ๋ฐํ ๊ฐ์ ์์ ํ ๋ฌด์ํฉ๋๋ค.)
@์ผํธ๋ฆด
์ ๋ง ์นํธ์: "๋ฐํ โฅ"์ ํ ๊ฒฝ์ฐ์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
๊ธ์์, ๊ทธ๊ฒ์ ๋ถ๋ช ํ ์ ์์ ๋ฌธ์ ์ ๋๋ค. ๋ด๊ฐ ์ค๋ช ํ๋ CTFE ๊ฑด์ ์ฑ ๋ณด์ฆ์ ์ดํดํ๊ณ ์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ณด์ฆ์ด๋ผ๋ ๋ฐ ๋์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ด ์ฐ๋ฆฌ ๊ฐ ์ํ๋ ์ ๋ถ์ธ์ง๋ ํ ๋ก ์ ๋์์ ๋๋ค :)
์ข์์; ๋น์ ์ ๋๋ฅผ ์์๋ค; ๋ ์ ์ ๊ฐ ์ฃผ์ด์ง๋ฉด ์ด "safe const fn is deterministic" ๋ณด์ฅ์ ์ด๋ป๊ฒ ๋๋ฌํ๋์ง ์ ์ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ฅผ ์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น?
foo(x)
์ ๋ํ ํธ์ถ์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์ foo
๋ ์์ ํ const ํจ์์ด๊ณ x
๋ const-valid ๊ฐ์
๋๋ค(์ฆ, &y as *const _ as usize
๊ฐ ์๋๋๋ค. ). ๊ทธ๋ฌ๋ฉด ์ฐ๋ฆฌ๋ foo(x)
๊ฐ const ์์ ์ ์ํด ์ค๋ฅ๋ฅผ ๋ฐ์์ํค์ง ์๊ณ CTFE์์ ์คํ๋๋ค๋ ๊ฒ์ ์๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก CTFE ๊ฑด์ ์ฑ์ ์ํด ๋ฐํ์์ foo(x)
๋ CTFE์์์ ๋์ผํ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
๋ณธ์ง์ ์ผ๋ก ์ ๋ ๊ทํ์ ๋ณด์ฆ์ ๋ ๋ถ๋ถ์ผ๋ก ๋ถํดํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ํ๋๋ ์์ ํ const fn์ด CTFE๊ฐ ์ง์ํ์ง ์๋ ์์ ์ ์๋ํ์ง ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค(์: stdin์์ ์ฝ๊ธฐ ๋๋ ํฌ์ธํฐ์ ์ตํ์ ๋ฐ์ดํธ๊ฐ 0์ธ์ง ํ์ธ). CTFE ๊ฐ ์ง์ํ๋ ๋ชจ๋ ๊ฒ์ด ๋ฐํ์๊ณผ ์ผ์นํ๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค.
์ด ๋จ๋ฝ์ ๋ด ๊ท์ ์์ ์ ๋๋ค! ๋ง์ ์ด๊ฒ์ ๊ฒฐ์ ๋ก ("์์ํจ")์ ๋ณด์ฅํ๋ ๊ฒ ๊ฐ์ต๋๊น? ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ ํํ ๋ด๊ฐ ์ด์ ์ ์ผ๋์ ๋์๋ ๊ฒ์ ๋๋ค. ๋๋ const ์์ ๋ ํ๋ฅญํ ์ฉ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค!
๋ง์์ ๋์ ๋ค๋ ๋คํ์
๋๋ค. :) ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ์ฌ๊ธฐ์ ๋งํ๋ ๊ฒ์ ๋ง์นจ๋ด ์ดํดํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. "์์ํจ"์ ๋๋ฌด ๋ง์ ๋ค๋ฅธ ๊ฒ์ ์๋ฏธํ ์ ์์ด์, ๊ทธ ์ฉ์ด๊ฐ ์ฌ์ฉ๋ ๋ ์ข
์ข
์ฝ๊ฐ ๋ถ์ํจ์ ๋๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒฐ์ ๋ก ์ const ์์ ์ ์ํ ์ถฉ๋ถ ์กฐ๊ฑด์ด ์๋๋ฉฐ ๊ด๋ จ ๊ธฐ์ค์ CTFE์์ ์คํ ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง ์ฌ๋ถ์
๋๋ค. (deterministc non-const-safe ํจ์์ ํ ๊ฐ์ง ์๋ orcale
์ 0์ ๊ณฑํ ๋ด ๋ณํ์
๋๋ค. ํฌ์ธํฐ์ ๋ฐ์ดํธ๋ฅผ ๊ฒ์ฌํ ๋ ๋ฏธ๋ฆฌ๊ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์์ ํ์ง ์์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ด ์์
์ ์ํํ๋ ๊ฒ์ ์ข์ง ์์ต๋๋ค. ๋ฐ์ดํธ๊ฐ ๊ถ๊ทน์ ์ผ๋ก ์ค์ํ์ง ์๋๋ผ๋ ํฌ์ธํฐ์ ์ตํ์ ๋ฐ์ดํธ๋ฅผ ์ถ์ถํ๋ ์์
์ด "const-UB"์ด๋ฏ๋ก ์์ ํ์ง ์์ const ์ฝ๋์์๋ ํ์ฉ๋์ง ์๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.)
์, ๋ฐฐ์ด ์์์ ๋์ ์ง๋๋ ํฌ์ธํฐ๋ ์๋ง๋ ๋ค์ ๋ฐฐ์ด ์์๋ฅผ ๊ฐ๋ฆฌํฌ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ๋ญ? ์ ๋ง ๋น๊ฒฐ์ ์ ์๋๊ฐ์? ์ด์จ๋ ์ปดํ์ผ ํ์์ ๊ฒฐ์ ์ ์ธ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ด๊ฐ ๊ฑฑ์ ํ๋ ํ ๋ฐํ์ ํ๊ฐ๋ ์คํ ๊ณ ๊ฐ๋ก ์ธํด segfault๊ฐ ๋ ์ ์์ต๋๋ค.
@RalfJung
๊ทธ๋ฌํ ์์คํ ์ ๋น์ฉ์ ์์ ํ ๊ณ ์ฐจ
const fn
๊ฐ ํด๋ก์ ์คํ ์์ฒด๊ฐ "const ์์ "์ ์๋ฐํ์ง ์๋๋ค๋ ๊ฒ์ ๋ณด์ฅํ ์ ์๋๋ก const fn ํด๋ก์ ๋ฅผ ์ทจํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ด ์ค์ ๋ก ์์ ํconst fn
์ ๋ํ ์ ์ ํ ๋ณด์ฆ์ ์ป๋ ๋๊ฐ์ ๋๋ค.
?const
๋ฅผ ๋์
ํ์ฌ ๋๋ถ๋ถ์ ๊ธฐ์กด ์ฝ๋ ๋ณํ์ ์ง์ํ๊ธฐ ์ํด ์ด๊ฒ์ด const
?const fn(T) -> U
๋ฐ์ธ๋ฉ๋ ์ ์๋ ๊ณ ์ฐจ ํจ์๋ฅผ ์์ฑํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. is_const(x : T)
; ๊ทธ๋์ ๋น์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค :
?const fn twice(fun: ?const fn(u8) -> u8) { fun(fun(42)) }
fn id_impure(x: u8) -> u8 { x }
const fn id_const(x: u8) -> u8 { x }
?const fn id_maybe_const(x: u8) -> u8 { x }
fn main() {
let a = twice(id_impure); // OK!
const b = twice(id_impure); // ERR!
let c = twice(id_const); // OK!
const d = twice(id_const); // OK!
let e = twice(id_maybe_const); // OK!
const f = twice(id_maybe_const); // OK!
}
์ผ์ฃผ์ผ ์ ๋ ํ์ ์ด ํจ๊ณผ(๋ฐ ๊ทธ ์ด์)์ ๋ํด ์ ์ํ๋ RFC๋ฅผ ์์ฑํ ๊ฒ์ ๋๋ค.
@Centril ์ ์ด ์์ ์์ ํจ๊ณผ ๋คํ์ฑ์ ์ฌ์ฉํ์ฌ ํจ๊ณผ ์์คํ ์ ๊ฐ๋ฐํ๊ณ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ํญ์ ๋น์ ์ ๋น๋ฐ(?) ์์ ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
@RalfJung ์๋
์ https://github.com/rust-lang/rfcs/pull/2237์์ ์ด๋ฏธ ๋น๋ฐ์ ๊ณต๊ฐํ์ง๋ง ๋ค์ ์์ฑํด์ผ ํ ๊ฒ์
๋๋ค ;)
์ด์ ๊ฑฐ์ ๊ณต๊ฐ ๋๋ฉ์ธ ^,-
@SoniEx2
์, ๋ฐฐ์ด ์์์ ๋์ ์ง๋๋ ํฌ์ธํฐ๋ ์๋ง๋ ๋ค์ ๋ฐฐ์ด ์์๋ฅผ ๊ฐ๋ฆฌํฌ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ๋ญ? ์ ๋ง ๋น๊ฒฐ์ ์ ์๋๊ฐ์? ์ด์จ๋ ์ปดํ์ผ ํ์์ ๊ฒฐ์ ์ ์ธ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ด๊ฐ ๊ฑฑ์ ํ๋ ํ ๋ฐํ์ ํ๊ฐ๋ ์คํ ๊ณ ๊ฐ๋ก ์ธํด segfault๊ฐ ๋ ์ ์์ต๋๋ค.
๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ๋ฐ์ํฉ๋๋ค(C++์์).
int x[2];
int y; // let's assume y is put right after the end of x in the stack frame
if (&x[0] + 2 == &y) {
// ...
}
C ์ปดํ์ผ๋ฌ๋ false
์ ๋ํ ๋น๊ต๋ฅผ ์ต์ ํํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ๊ฒฐ๊ตญ ํ๋์ ํฌ์ธํฐ๋ x
๋ฅผ ๊ฐ๋ฆฌํค๊ณ ๋ค๋ฅธ ํ๋๋ y
๋ฅผ ๊ฐ๋ฆฌํค๋ฏ๋ก ๋ ํฌ์ธํฐ๊ฐ ๊ฐ์ ์๋ ์์ต๋๋ค.
๋ฌผ๋ก , ํ๋์ ํฌ์ธํฐ๊ฐ x
์ ๋์ ๊ฐ๋ฆฌํค๊ณ $#$5 y
#$ ์ ๊ฐ์ ์ฃผ์์ธ ๋จธ์ ์์ ์ฃผ์ ๊ฐ ๋์ผํ๋ค๋ ์ ์ ์ ์ธํฉ๋๋ค! ๋ฐ๋ผ์ ์ปดํ์ผ๋ฌ๊ฐ ์ฃผ์์ ์ถ์ฒ๋ฅผ ๋ ์ด์ ๋ณผ ์ ์๋๋ก ์ฝ๋๋ฅผ ์ถฉ๋ถํ ๊ฐ๋ฆฌ๋ฉด ๋น๊ต๊ฐ true
๋ก ํ๊ฐ๋๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ C++ ํ์ค์ ์ต์ ํ( false
๋ผ๊ณ ํจ)์ ์ด์
๋ธ๋ฆฌ๋ก ์ปดํ์ผ( true
๋ผ๊ณ ํจ)์ ๋ชจ๋ ์ ๋นํํ์ฌ ๋ ๊ฒฐ๊ณผ๊ฐ ๋ชจ๋ ๋น๊ฒฐ์ ์ ์ผ๋ก ๋ฐ์ํ๋๋ก ํ์ฉํฉ๋๋ค. C ํ์ค์ ์ด๋ฅผ ํ์ฉํ์ง ์์ผ๋ฏ๋ก LLVM(๋ฐ GCC) ๋น์ค์ ์ปดํ์ผ๋ฌ๋ ๋ ๋ค ์ด๋ฌํ ์ข
๋ฅ์ ์ต์ ํ๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋๋ ์ด ์ค๋ ๋ ๋ฐ/๋๋ IRC์ ๋ํ ๊ด๋ จ ํ ๋ก ์์ ๋์จ const ์์ , const ๊ฑด์ ์ฑ ๋ฑ์ ๋ํ ๋ด ์์ด๋์ด์ ์์ฝ์ ์์ฑํ์ต๋๋ค. https://www.ralfj.de/blog/2018/07/19/ const.html
์ฌ๊ธฐ์์ ์ด ๋ฌธ์ ๋ ๋๋ฌด ๋ง์ ๊ฒ๋ค์ด ๋ ผ์๋์๊ธฐ ๋๋ฌธ์ ํ๊ธฐ ๋ค์ ์ด๋ ค์์ก์ต๋๋ค. @oli-obk๋ const-eval ๋ฌธ์ ์ ๋ํ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ ์ฉํ๊ฒ ๋ง๋ค์์ต๋๋ค. ๋ฐ๋ผ์ ํน์ ํ์ ๋ฌธ์ ๋ฅผ ๋ ผ์ํ๊ธฐ์ ์ข์ ์ฅ์๋ ์๋ง๋ https://github.com/rust-rfcs/const-eval์ ๋ฌธ์ ์ถ์ ๊ธฐ์ผ ๊ฒ์ ๋๋ค.
@Centril ์ ํฅํ ํ์ฅ๊ณผ ํธํ๋๋ ์ต์ ๋ฒ์ ์ ์์ ํํ ๊ฒ์ ์ ์ํ์ต๋๋ค.
fn
ํฌ์ธํฐ ๋๋ dyn Trait
์ ํ์ ์ธ์ ๋๋ ๋ฐํ ์ ํ ์์union
์ ์์ ํฌ์ธํฐ derefs(์ผ๋ฐ์ ์ผ๋ก ํ์ฌ ์์์์ ๊ธ์ง๋จ)๋ฅผ ์ ์ธํ๊ณ ๋ ๊ด์ฐฎ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ์์ ํ์ง ์์ ์ฝ๋๋ ๋ค๋ฅธ ์์ ํ์ง ์์ const fns ๋๋ const ๋ด์ฅ ํจ์๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ฉฐ, ์ด๋ ์์ฒด ํ ๋ก wrt ์์ ํ๊ฐ ํ์ํฉ๋๋ค.(nit: ๋ด ์ ์์๋ fn
ํฌ์ธํฐ ๋๋ $#$ const fn
๋ฐํ ์ ํ์ ๋ํ dyn Trait
์ ๋ํ ์ฌ๊ท ๊ฒ์ฌ๋ ํฌํจ๋์์ต๋๋ค.)
ํน์ฑ ๊ฒฝ๊ณ๊ฐ ์๋ ์ผ๋ฐ ์ธ์ ์์
๋ช ํํ ํ์๋ฉด, ์ด์ ๊ฐ์ ๊ฒ์ด ๋ฐ์๋ค์ฌ์ง ๊ฒ์ธ๊ฐ ๋ง ๊ฒ์ธ๊ฐ?
struct Mutex<T> where T: Send { /* .. */ }
impl<T> Mutex<T> where T: Send {
pub const fn new(val: T) -> Self { /* .. */ }
}
๊ฒฝ๊ณ๋ const fn
์์ฒด์ ์ผ๋ถ๊ฐ ์๋๋๋ค.
๋ํ ๋ช ํํ ํ๊ธฐ ์ํด: ์ด๋ฌํ ๊ฒ๋ค์ ์์ ํํ๊ณ ๋๋จธ์ง๋ ๊ธฐ๋ฅ ๊ฒ์ดํธ ๋ค์ ๋จ๊ฒจ๋๋ ์ ์์ด ์๋๋ฉด ๊ทธ๊ฒ๋ค์ ์์ ํํ๊ณ ๋๋จธ์ง๋ฅผ ๋ชจ๋ ์ค๋ฅ๋ก ๋ง๋ค๋ ค๋ ์ ์์ ๋๊น?
@mark-im ๋๋จธ์ง๋ ๊ธฐ๋ฅ ๊ฒ์ดํธ ๋ค์ ๋จ์ต๋๋ค.
@oli-obk ์์ ํ์ง ์์ ์ฝ๋์ ๋ฌธ์ ๋ ๋ฌด์์
๋๊น? ๋ชจ๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์๋ const X : Ty = ...
์์ unsafe ๋ฅผ ํ์ฉํฉ๋๋ค. const fn
๋ฐ๋๋ const
๋ฐ๋์ ๋์ผํ๊ฒ ํ์ธ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ์ฐ๋ฆฌ๊ฐ "unconst" ์์ ์ ๋ํด ๋ณด์์ ์ผ๋ก ์ ์งํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฆ, ์์ ํ์ง๋ง const-safeํ์ง ์์ ์์ (๊ธฐ๋ณธ์ ์ผ๋ก ์์ ํฌ์ธํฐ์ ๋ํ ๋ชจ๋ ๊ฒ)์ด์ง๋ง ์ด๋ฌํ ์์ ์ ์ด๋ฏธ const ์ปจํ ์คํธ์์ ์์ ํ ํ์ฉ๋์ง ์์ต๋๋ค. ๋ง์ต๋๊น?
๊ฒฝ๊ณ๋ const fn ์์ฒด์ ์ผ๋ถ๊ฐ ์๋๋๋ค.
์๋์, ํด๋น ์ ์์์๋ impl ๋ธ๋ก์ ๊ฒฝ๊ณ๋ ํ์ฉ๋์ง ์์ต๋๋ค.
์์ ํ์ง ์์ ์ฝ๋์ ๋ฌธ์ ๋ ๋ฌด์์ ๋๊น?
๋ด ์๊ฒฌ์ ์ธ๊ธ ๋๋๋ก ๋ฌธ์ ๊ฐ ๋ณด์ด์ง ์์ต๋๋ค. ๋ชจ๋ const ์์ ํ์ง ์์ ๊ธฐ๋ฅ/๊ธฐ๋ฅ์ ์ด์จ๋ ์์ฒด ์์ ํ๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
@RalfJung ๋ด ์๊ฐ์ ๋ฌธ์ ๋ " @Centril ์ ์ฐ๋ฆฌ๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น ๊ฒ์ ๋ํด ๊ธด์ฅํ๊ณ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ ์ด๋ฏธ const ์ปจํ
์คํธ์์ ์์ ํ ํ์ฉ๋์ง ์์ต๋๋ค"์
๋๋ค. ;) ํ์ง๋ง ์ด๋ค ์์ ์์ unsafe { .. }
in const fn
๋ฅผ ์์ ํํด์ผ ํ๋ฏ๋ก ๋ฌธ์ ๊ฐ ์๊ณ ๋ชจ๋ unconst ์์
์ ํฌ์ฐฉํ๋ค๊ณ ํ์ ํ๋ฉด ์คํํด ๋ณผ๊น์?
๊ฒ๋ค๊ฐ, ์ฐ๋ฆฌ๊ฐ ๋ญ๊ฐ๋ฅผ ๋์ณค๋ค๋ฉด, ์ฌ๋๋ค์ด const
์์ ๊ทธ๊ฒ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๋งํ์ต๋๋ค.
๋๋ ์ฌ์ ํ const fn RFC repo ์ const ์์ /์น์ง ๋ถ๋ถ์ ์ฑ์ฐ๋ PR์ ์์ฑํ ๊ณํ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ชจ๋ ๊ฒ์ ๋ค๋ฃจ์๋์ง(๊ทธ๋ฆฌ๊ณ ํ ์คํธ ์ผ์ด์ค๊ฐ ์๋์ง) ์ฃผ์ ๊น๊ฒ ํ์ธํด์ผ ํ ๋์ ๋๋ค.
Discord์ ๋์จ ๋ ๋ค๋ฅธ ์ฌํญ์ FP ์์ ์ ๋๋ค. ํ์ฌ๋ก์๋ ์ค์ ํ๋์จ์ด์ ์ผ์นํ๋ค๊ณ ๋ณด์ฅํ ์ ์์ต๋๋ค. CTFE๋ IEEE๋ฅผ ์ ํํ ๋ฐ๋ฅด์ง๋ง LLVM/ํ๋์จ์ด๋ ๊ทธ๋ ์ง ์์ ์ ์์ต๋๋ค.
์ด๋ const
ํญ๋ชฉ์๋ ์ ์ฉ๋์ง๋ง ๋ฐํ์์ ์คํ๋์ง ์๋ ํญ๋ชฉ์
๋๋ค. ๋ฐ๋ฉด const fn
๋ ๊ทธ๋ด ์ ์์ต๋๋ค. ๋ฐ๋ผ์ const fn
์์ FP ์์
์ ์์ ํํ์ง ์๋ ๊ฒ์ด ํ๋ช
ํด ๋ณด์
๋๋ค.
OTOH, ์ฐ๋ฆฌ๋ ์ด๋ฏธ FP ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ํ๋ณดํฉ๋๊น? ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ด๋ฏธ stable์์ ๊ด์ฐฐ ๊ฐ๋ฅํ ๋ฐํ์/์ปดํ์ผ ์๊ฐ ๋ถ์ผ์น๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ทจ์ํ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋ถํ๊ตฌ๋ฅผ ์คํํ ๊ฐ์น๊ฐ ์์ต๋๊น?
๋์ค์ ์ฐธ์กฐํ ์ ์๋๋ก ๋ค์ ๋ฌธ์๋ ๋ถ๋ ์์์ ๋ฐ ๊ฒฐ์ ๋ก ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
@RalfJung
์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ทจ์ํ ์ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋ถํ๊ตฌ๋ฅผ ์คํํ ๊ฐ์น๊ฐ ์์ต๋๊น?
์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ํ ์ ์๋ค๋ฉด ๋๋ผ๊ฒ ์ง๋ง ์ ์ด๋ ์๋ํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค. :)
@RalfJung ์ด ์ค๋ ๋ https://github.com/rust-lang/rust/issues/24111#issuecomment -386764565์ ํฅ๋ฏธ๋ก์ด ์ ๋ ฅ์ด ์์ ์ ์์ต๋๋ค.
ํค์๋ ํ์์ const fn
๋ก ์ ์งํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํ ๋ ์ง๊ธ ์์ ํํ๋ ๊ฒ์ ์ถฉ๋ถํ ์ ํ์ ์ด๋ฉฐ ๊ฝค ๊ด์ฐฎ์ ์๋ฃจ์
์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ฌํ ๋จํธ์ ์ธ ์์ ํ ์์
์ ์ํํ ๋
์ ํ ์ฌํญ๊ณผ ๊ทธ ์ ๋น์ฑ์ ๋ํ ๋ช
ํํ ๋ชฉ๋ก์ ์์ฒญํ์ญ์์ค. ์ด๊ฒ์
์ฌ์ฉ์๊ฐ ๊ฒ๋ณด๊ธฐ์ ๋ฌดํดํ ๋ณ๊ฒฝ์ ํ๊ณ
์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฏ๋ก ์ต์ํ ์ค๋ฅ๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๋
์ถ๋ก ์ด ๋ง์ ํ ๋ก ์ ๊ฑธ์ณ ํผ์ ธ ์์์ ์ธ์ํฉ๋๋ค.
๋๋ ๋ฐ๋ผํ์ง๋ง ๋ฌธ์์ ํ
์ด๋ธ์ด ์์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค (๋๋
์ฐธ์กฐ ๋๋ nomicon, ์ต์ํ) ํ์ฉ๋์ง ์๋ ๊ฐ ์์
์ ๋์ดํ๊ณ ,
๋ฐ์ํ ์ ์๋ ๋ฌธ์ ๋ฐ ์์ ํ ๊ฐ๋ฅ์ฑ(์: "์ ๋",
"RFC XYZ๊ฐ ๊ตฌํ๋ ๊ฒฝ์ฐ", "์ฌ์์ ์ด ๋ถ๋ถ์ ํ์ ํ ํ").
2018๋
8์ 20์ผ ์์์ผ ์คํ 1:44 Eduard-Mihai Burtescu <
[email protected]>์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
ํค์๋ ํ์์ const fn์ผ๋ก ์ ์งํ๊ณ ์ถ๋ค๊ณ ๊ฐ์ ํ๋ฉด
์ง๊ธ ์ ์ถฉ๋ถํ ์ ํ์ ์ด๋ฉฐ ๊ฝค ๊ด์ฐฎ์ ์๋ฃจ์ ์ ๋๋ค(์ด๋ป๊ฒ
๋ด๊ฐ ์ ์ ๋ณธ ์ ์ด ์์ด?!)โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/24111#issuecomment-414403036 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAC3n80yVxIa3agsJP4wXZFkgyHVmAsjks5uSvWXgaJpZM4D66IA
.
@est31 @rkruppe ๊ฐ ์ด๋ฏธ ์ผ๋ฏ์ด ์ด๋ฌํ ํจ์ฆ๋ -ffast-math
์์ด ์๋ํ๋ ๊ฒ์ด ๋ถ๋ฒ์ด๋ฉฐ LLVM์ด ์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ด๊ฐ ๊ธฐ์ตํ๋ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ๊ธฐ๋ณธ ์ฐ์ ์ ๊ทธ๋ค์ง ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง(x87... ๋๋ฌธ์ 32๋นํธ x86 ์ ์ธ) ์ด์ ํจ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ๋ค์ const fn
๊ฐ ์๋๋๊น? ๊ทธ๋์ ์ ํฌ๋ง์ ๊ฒฐ๊ตญ const
ํญ๋ชฉ, ํ์ด ๋ฐ const fn
์ฌ์ด์์๋ ๋๋ฑํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@RalfJung ์๋ฅผ ๋ค์ด ์ ์ถ ๋ฐ ์ผ๋ถ ์์ ์ฌ์ด์ FPU ๋ ์ง์คํฐ๋ก ๋ค์ ๋ก๋ํ๋ฉด ์ ์ถ ์์ด ๋์ผํ ๊ณ์ฐ๊ณผ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค๊ณ ํ์ ํ์ง ๋ชปํฉ๋๋ค.
๋ด๊ฐ ๊ธฐ์ตํ๋ ๋ฐ์ ๋ฐ๋ฅด๋ฉด ๊ธฐ๋ณธ ์ฐ์ ์ ๊ทธ๋ค์ง ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง(x87... ๋๋ฌธ์ 32๋นํธ x86 ์ ์ธ) ์ด์ ํจ์๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด์ ํจ์๋ ์ด๋ป๊ฒ ๋ฌธ์ ๋ฅผ ์๋ฏธํฉ๋๊น?
IIRC์์ ์ผ๋ถ ์ด์ ๊ธฐ๋ฅ์ ์ผ๋ฐ x86 ํ๋ก์ธ์์์ ์ง์๋์ง๋ง ์ด๋ฌํ ๊ธฐ๋ฅ์ ๋๋ฆฌ๊ณ ํผํ๋ฉฐ ๊ธฐ์กด ๊ตฌํ๊ณผ์ ์์ ์ฑ๊ณผ ํธํ์ฑ์ ์ํด์๋ง ํฌํจ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ฑฐ์ ๋ชจ๋ ๊ณณ์์ ์ด์ ํจ์๋ ๊ธฐ๋ณธ ์ฐ์ ํจ์์ ์กฐํฉ์ผ๋ก ํํ๋ฉ๋๋ค. ์ด๊ฒ์ ์ฐ์ ํจ์์ ์ฐธ์กฐ ํฌ๋ช ๋์ ์ฐจ์ด๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ด "์์ "ํ๋ค๋ฉด ์ด์ ๊ธฐ๋ฅ์ ํฌํจํ์ฌ ๊ทธ ์์ ๊ตฌ์ถ๋ ๋ชจ๋ ๊ฒ์ด ์์ ํฉ๋๋ค. ์ฌ๊ธฐ์ "์ฐธ์กฐ ๋ถํฌ๋ช ์ฑ"์ ์ ์ผํ ์ถ์ฒ๋ ์ด๋ฌํ ๊ธฐ๋ณธ ์ฐ์ ํจ์์ ๊ด์ ์์ ์ด๋ฌํ ์ด์ ํจ์์ ์๋ก ๋ค๋ฅธ ๊ทผ์ฌ(๊ตฌํ)์ผ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ๋ฌธ์ ์ ๊ทผ์์ธ๊ฐ?
@est31 ๋๋ถ๋ถ์ ์ด์ ํจ์๋ ๊ถ๊ทน์ ์ผ๋ก ์์ ์ ์์ ๋ถ๋ ์์์ ์ฐ์ฐ์ผ๋ก ๊ตฌ์ฑ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋์ผ ๋ฟ์ด์ง๋ง, ์ด๋ฌํ ๊ตฌํ์ ํ์คํ๋์ง ์์์ผ๋ฉฐ ์ค์ ๋ก Rust ํ๋ก๊ทธ๋จ์ ์๋ช ๋์ ์ธ ๊ฐ์ง ๋ค๋ฅธ ๊ตฌํ๊ณผ ์ํธ ์์ฉํ ์ ์์ผ๋ฉฐ, ๊ทธ ์ค ์ผ๋ถ๋ ํธ์คํธ ๋๋ ๋์์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ํ๋ซํผ:
rustc_apfloat
๋๋ https://github.com/japaric/libm/๊ณผ ๊ฐ์ Rust ๊ตฌํ ํด์).์ด ์ค ํ๋๋ผ๋ ์๋ก ์ผ์นํ์ง ์์ผ๋ฉด ํํ์์ด ํ๊ฐ๋๋ ์์ ์ ๋ฐ๋ผ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
@rfcbot ์ทจ์
์ฐ๋ฆฌ๋ ๊ฐ๊น์ด ์ฅ๋์ ์ ์ฒด monty๋ฅผ ์์ ํํ ๊ฒ ๊ฐ์ง ์์ต๋๋ค.
๋์ , ๊ฐ๊น์ด ์์ผ ๋ด์ ์์ ํ๋ ์ ์๋ ๋ณด๋ค ์ต์ํ์ ํ์ ์งํฉ(https://github.com/rust-lang/rust/issues/24111#issuecomment-414310119์ ๋๋ต์ ์ผ๋ก ์ค๋ช
๋จ)์ ๋ํ ํฉ์๋ฅผ ๋ฐ์ ์ํค๊ณ ์ถ์ต๋๋ค. .
์ด ํ์ ์งํฉ์ #53555์์ ์ถ์ ๋ฉ๋๋ค. ์์ธํ ์ค๋ช
์ ๊ฑฐ๊ธฐ์์ ๋ณผ ์ ์์ต๋๋ค.
@Centril ์ ์์ด ์ทจ์๋์์ต๋๋ค.
@rkruppe ์ด์ ํจ์๋ฅผ llvm ๋ด์ฅ ํจ์๋ก ๋ฎ์ถ๋ ์ด์ ๊ฐ ์์ต๋๊น? ์ฐ๋ฆฌ๊ฐ ์ ์ดํ๊ณ ๋ชจ๋ ํ๋ซํผ์์ ๋์ผํ๊ฒ ์ ์๋ ค์ง ๋ น ์ ์ฉ ๊ตฌํ์ผ๋ก ๋ฎ์ถ์ด ์ ์ฒด ๋ฌธ์ ๋ฅผ ํผํ ์๋ ์์ต๋๊น?
์ด์ ํจ์๋ฅผ llvm ๋ด์ฅ ํจ์๋ก ๋ฎ์ถ๋ ์ด์ ๊ฐ ์์ต๋๊น?
์ ์ฒด ํฌ๋ก์ค ํ๋ซํผ libm์ ๊ตฌํํ์ง ์๋ ๋จ์์ฑ ์ธ์๋ ๋ด์ฅ ํจ์๋ LLVM์ ์ต์ ํ ํ๋ก๊ทธ๋จ๊ณผ ์ฝ๋ ์์ฑ์์ ์ผ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๊ฐ ์ป์ ์ ์๋ ์ด์ ์ด ์์ต๋๋ค. ๋ถ๋ช
ํ ์ผ์ ํ ์ ๊ธฐ(& ๊ฐ ๋ฒ์ ๋ถ์๊ณผ ๊ฐ์ ๊ด๋ จ ํญ๋ชฉ)๋ ์ด ์ปจํ
์คํธ์์ ๋ฌธ์ ์ด์ง๋ง ๊ทธ๋ ์ง ์์ผ๋ฉด ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ๋์์ ID๋ ์์ต๋๋ค(SimplifyLibCalls ํจ์ค์ ์ํด ์ ์ฉ๋จ). ๋ง์ง๋ง์ผ๋ก, ๋ช ๊ฐ์ง ํจ์(๋๋ถ๋ถ sqrt์ ๊ทธ ์ํธ, ์ด์์ ์ด์ง๋ ์์ง๋ง ๋ฌด์์ด๋ ๊ฐ์)์๋ SSE๋ฅผ ์ฌ์ฉํ์ฌ x86์์ sqrtss
๋ฅผ ์์ฑํ๋ ํน์ ์ฝ๋ ์์ฑ ์ง์์ด ์์ต๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ ์ดํ๊ณ ๋ชจ๋ ํ๋ซํผ์์ ๋์ผํ๊ฒ ์ ์๋ ค์ง ๋ น ์ ์ฉ ๊ตฌํ์ผ๋ก ๋ฎ์ถ์ด ์ ์ฒด ๋ฌธ์ ๋ฅผ ํผํ ์๋ ์์ต๋๊น?
์์ ๋ชจ๋ ์ฌํญ์ ๋ฌด์ํ๋๋ผ๋ IMO๋ ์ข์ ์ต์ ์ด ์๋๋๋ค. ๋์ ํ๋ซํผ์ C libm์ด ์๋ ๊ฒฝ์ฐ ๋ ์ต์ ํ๋์๊ฑฐ๋ ํฝ์ฐฝ์ ํผํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค.
๋ด์ฅ ํจ์๋ LLVM์ ์ตํฐ๋ง์ด์ ์ ์ฝ๋์ ์์ ์ผ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๊ฐ ์ป์ ์ ์๋ ์ด์ ์ด ์์ต๋๋ค.
๋น ๋ฅธ ์ํ์ด ์ผ์ ธ ์๋ ๊ฒฝ์ฐ์๋ง ์ด๋ฌํ ์ต์ ํ๊ฐ ํ์ฑํ๋๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋์ ํ๋ซํผ์ C libm์ด ์๋ ๊ฒฝ์ฐ ๋ ์ต์ ํ๋์๊ฑฐ๋ ํฝ์ฐฝ์ ํผํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค.
ํ์ ํ๋. ์ปดํ์ผ๋ ๋ฐ์ด๋๋ฆฌ ๋๋ ๋ ์์ ๋ฐ์ด๋๋ฆฌ์ ์๋ ํฅ์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์ํด ์ด ๋ค์ ํ๋ฌธ์ ์ธ ์์ฑ(์ฐธ์กฐ ํฌ๋ช
์ฑ)์ ๊ตํํ ์ ์๋ ์ต์
์ด ํญ์ ์์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด libm
ํ๋ซํผ์ ์ฌ์ฉํ๊ฑฐ๋ ๋น ๋ฅธ ์ํ ๋ชจ๋๋ฅผ ์ผญ๋๋ค. ์๋๋ฉด ์์ํ ๋น ๋ฅธ ์ํ ๋ชจ๋๋ฅผ ํ์ฉํ์ง ์์์ผ ํ๋ค๊ณ ์ ์ํ์ญ๋๊น?
IMO ์ฐ๋ฆฌ๋ const ์ปจํ
์คํธ์์ f32::sin()
๋ฅผ ํ์ฉํ์ง ์์์ผ ํฉ๋๋ค. ์ ์ด๋ +
, -
๋ฑ์ ํ์ฉํ๋ ๊ฒฝ์ฐ์๋ ํ์ฉํ์ง ์์์ผ ํฉ๋๋ค. ์ด๋ฌํ ๊ธ์ง๋ ์ฌ๋๋ค์ด ์์๋ฅผ ๋ง๋ค๊ณ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํ ๊ฒ์
๋๋ค. const ํธํ ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค.
๋น ๋ฅธ ์ํ์ด ์ผ์ ธ ์๋ ๊ฒฝ์ฐ์๋ง ์ด๋ฌํ ์ต์ ํ๊ฐ ํ์ฑํ๋๋ค๊ณ ์๊ฐํ์ต๋๋ค.
์ด๋ฌํ ํจ์์ ๋ํ ์ง์์ ์ธ ํ๊ฐ์ sqrtss
์ ๋ฐฉ์ถ์ -ffast-math ์์ด ์ ๋นํํ๊ธฐ ์ฝ์ต๋๋ค. ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ์ฌ๋ฆผํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์๋๋ฉด ์์ํ ๋น ๋ฅธ ์ํ ๋ชจ๋๋ฅผ ํ์ฉํ์ง ์์์ผ ํ๋ค๊ณ ์ ์ํ์ญ๋๊น?
๋๋ ์๋ฌด ๊ฒ๋ ์ ์ํ์ง ์์ผ๋ฉฐ ๊ทธ๋ฌํ ์ฌ์ฐ์ด ๋ณด์ฅ๋์ด์ผ ํ๋์ง์ ๋ํ ์๊ฒฌ(atm)๋ ์์ต๋๋ค. ๋๋ ๋จ์ํ ์ ์ฝ ์กฐ๊ฑด์ ๋ณด๊ณ ํ๊ณ ์์ต๋๋ค.
const fn ์ปจํ
์คํธ์์ Vec
๋ก ์ธํ ICE์ ๋ํ ๋ฏธํด๊ฒฐ ๋ฌธ์ ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
์ด์ ๋ํ ์ ๋ฌธ์ ๋ฅผ ์ด์ด์ผ ํฉ๋๊น?
@Voultapher ๋ค, ์๋ก์ด ICE์ฒ๋ผ ๋ณด์ ๋๋ค.
์๊ฒ ์ต๋๋ค. #55063์ ์ด์์ต๋๋ค.
์ปดํ์ผ๋ฌ๊ฐ ์ฌ์ฉ์๊ฐ const fn
์ฃผ์์ ๋ฌ ๋ ์ปดํ์ผ ํ์ constexpr์์ ํจ์๋ฅผ ํธ์ถํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค๋ฉด ๋ชจ๋ ํจ์์ ๋ํ ๊ฒ์ฌ๋ฅผ ์๋์ผ๋ก ์ํํ์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น? (์๋ ํน์ฑ๊ณผ ์ ์ฌ)? ์ค์ ๋ถ์ ์ ์ธ ์ํฅ์ ์๊ฐ๋์ง ์์ผ๋ฉฐ, ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ด ์ธ๊ฐ์ ํ๋จ์ ์์กดํ ํ์๊ฐ ์๋ค๋ ๋ถ๋ช
ํ ์ด์ ์ด ์์ต๋๋ค.
์ฃผ์ ๋จ์ ์ ๊ณต๊ฐ ์ธ๋ถ ์ฌํญ์ด๋๋ฏ๋ก ๊ตฌํ
const๊ฐ ์๋ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝ์ด ์ด์ ์ค๋จ๋ฉ๋๋ค.
๋ํ ์ฐ๋ฆฌ๋ ์ธ๊ฐ์ ํ๋จ์ ์์กดํ ํ์๊ฐ ์์ต๋๋ค. ์ฃผ์์ด ์๋ ํจ์๊ฐ const fn
์ผ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์๋ ค์ฃผ๋ ํด๋ฆฌํผ ๋ณดํ์ ๊ฐ์ง ์ ์์ต๋๋ค. https://github.com/rust-lang/rust-clippy/issues/2440
์ด๊ฒ์ ์ง์ญ ๋ณ์์ ๊ฐ๋ณ์ฑ์ ์ถ๋ก ํ์ง ์๊ณ ๋์ ์ปดํ์ผ๋ฌ๊ฐ mut
๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ์์น๋ฅผ ์๋ ค์ฃผ๋ ๋ฐฉ๋ฒ๊ณผ ์ ์ฌํฉ๋๋ค.
@remexre const fn
๋ ์ธํฐํ์ด์ค ์ฌ์์ผ๋ก ์๋ํฉ๋๋ค. ๋๋ ์ด ๊ธฐ๋ฅ์ ์์ฃผ ์์ ์ธ๋ถ ์ฌํญ์ ๋ํด ์ ์์ง ๋ชปํ์ง๋ง(๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ฌ๊ธฐ์ ๋์ค๋ ๋ด์ฉ์ ์ด๋ฏธ ์๊ฐํ ๊ฒ์ผ ์ ์์) ํจ์๊ฐ const
๋ก ์๋ชป ์ฃผ์ ์ฒ๋ฆฌ๋ ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๊ฐ ์๋ ค์ฃผ๋ ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ด๋ฌํ ํจ์๊ฐ &mut
๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๊ฑฐ๋ ๋ค๋ฅธ ๋น const
ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ปดํ์ผ์ด ์คํจํฉ๋๋ค. ๋ฐ๋ผ์ const fn
์ ๊ตฌํ์ ๋ณ๊ฒฝํ๊ณ ์ด๋ฌํ ์ ํ์ ์ด๊ธฐ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์ค์งํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ (a) ๋ณ๋์ ๊ธฐ๋ฅ์์ const
๊ฐ ์๋ ๋นํธ๋ฅผ ๊ตฌํํ๊ฑฐ๋ ์๋๋ ๋ณ๊ฒฝ์ธ ๊ฒฝ์ฐ API๋ฅผ ์ค๋จํ๋๋ก ์ ํํ ์ ์์ต๋๋ค.
๋ด๊ฐ ๋
ผ์ํ ์ ์ด ์๋ ๋ ๋ค๋ฅธ ์ค๊ฐ ์ง์ ์ด ์์ผ๋ฉฐ ๋ช
์์ ์ผ๋ก ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ์ด ๋ง์ปค์ ๋ฐ๋์ ์ผ์ข
์ "ํจ์ ์๋ ์ถ๋ก "์ ๋์
ํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ฌธ์๋ ์ค์ ๋ง์ปค๋ฅผ ํ์ํ์ง๋ง const
์ธ ๊ฒฝ์ฐ ํด๋น ๋ง์ปค์ ์์ ์ฑ์ ๋ณด์ฅํ์ง ์๋๋ค๋ ์ผ์ข
์ ๊ฒฝ๊ณ ์ ํจ๊ป ํ์๋ฉ๋๋ค. ๋ฌธ์ ๋ ์ด๊ฒ์ด ๊ฒ์ผ๋ฆ์ ๋ถ์ถ๊ธฐ๊ณ ๊ฑฐ์ ๋งค๋ฒ ์ด๊ฒ์ ํ๋๋ก ๋ถ์ถ๊ธธ ์ ์๋ค๋ ๊ฒ์ธ๋ฐ, ์ด๋ ๋ชฉ์ ์ด ์๋๋๋ค.
const fn์ด ์ถ๋ ฅ์ ์์ฑํ ์ ์์ด์ผ ํฉ๋๊น? &mut
๊ฐ ํ์ฉ๋์ง ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น?
@aledomu ๋ด ์๊ฒฌ์ @AGaussman์๊ฒ ์ ๋ฌ๋์์ต๋๋ค. ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๊ฐ "์๋๋" const๊ฐ ์๋ ํจ์๋ฅผ ๋ ธ์ถํ๋ ๊ฒฝ์ฐ์ ๋ํด ์ด์ผ๊ธฐํ๊ณ ์์ต๋๋ค. const๊ฐ ์ ์ถ๋ ๊ฒฝ์ฐ ํด๋น ๊ธฐ๋ฅ์ const๊ฐ ์๋ ๊ฒ์ผ๋ก ๋ง๋๋ ๊ฒ์ ํ๊ธฐ์ ์ธ ๋ณ๊ฒฝ์ด ๋ ๊ฒ์ ๋๋ค.
@SoniEx2 const fn
๋ ์ปดํ์ผ ํ์์ ํ๊ฐํ ์ ์๋ ํจ์๋ก, ์ด๋ ๋ชจ๋ ์์ ํจ์์์๋ง ๋ฐ์ํฉ๋๋ค.
@remexre API์ ์์ ์ ์ธ ๋ถ๋ถ์ด ์๋ ๊ฒฝ์ฐ ํ์ํ์ง ๋ง์ญ์์ค.
๋ด๊ฐ ๋ ผํํ ์ถ๋ก ๋นํธ์ ๋ํด, ๊ทธ๊ฒ์ด ๋ด๊ฐ ํฌ๋ ์ดํธ ๋ฌธ์์ ๋ํ ๋ช ๊ฐ์ง ๊ฒฝ๊ณ ์ ํ์์ฑ์ ์ธ๊ธํ ์ด์ ์ ๋๋ค.
์ฐจ์ด์ ์ด ๋ญ์ผ? ์ ๋ ์์!
const fn add_1(x: &mut i32) { x += 1; }
let mut x = 0;
add_1(&mut x);
assert_eq!(x, 1);
x = 0;
add_1(&mut x);
assert_eq!(x, 1);
const fn added_1(x: i32) -> i32 { x + 1 }
let mut x = 0;
x = added_1(x);
assert_eq!(x, 1);
x = 0;
x = added_1(x);
assert_eq!(x, 1);
๋ค์๊ณผ ๊ฐ์ ๋์ ๋ฌธ์ ๋ฅผ ์ ์ถํ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋์ ๋ฌธ์ ๊ฐ ์ด๋ฏธ ์กด์ฌํฉ๋๋ค.
usize
์บ์คํธ์ ๋ํ ์์ ํฌ์ธํฐ: https://github.com/rust-lang/rust/issues/51910&mut T
์ฐธ์กฐ ๋ฐ ์ฐจ์ฉ: https://github.com/rust-lang/rust/issues/57349๋ค๋ฅธ ๋ฌธ์ ์ ์ํด ์์ง ์ถ์ ๋์ง ์์ ๋ค๋ฅธ ์์ญ์ด ์๋ ๊ฒฝ์ฐ, ๊ทธ ๋ถ๋ถ์ ๋ํด ๋
ผ์ํด์ผ ํฉ๋๋ค. const eval ๋ฐ const fn
, ๋๋ ์ฌ๋๋ค์ด ์๋ก์ด ๋ฌธ์ ๋ฅผ ๋ง๋ค ๊ฒ์ ์ ์ํฉ๋๋ค(๊ทธ๋ฆฌ๊ณ cc me + @oli-obk ํฌํจ).
์ด๊ฒ์ผ๋ก ์ด ๋ฌธ์ ์ ์ ์ฉ์ฑ์ ๋ง์น๋ฉฐ ์ด๋ก์จ ์ข ๋ฃ๋ฉ๋๋ค.
๋ชจ๋ ์ธ๋ถ ์ฌํญ์ ์ผ๋์ ๋์ง๋ ์์์ง๋ง miri์์ ์ง์ํ์ง๋ง min_const_fn
์์ ์์ง ํ์ฑํ๋์ง ์์ ๋ ๋ง์ ๊ฒ์ด ์์ง ์์ต๋๊น? ์๋ฅผ ๋ค์ด ์์ ํฌ์ธํฐ.
@SimonSapin ์, ์ ์ก์์ต๋๋ค. ์ด์ ๋ํ ๋ช ๊ฐ์ง ๊ธฐ์กด ๋ฌธ์ ๊ฐ ๋ ์์ต๋๋ค. ๋๊ธ + ๋ฌธ์ ์ค๋ช ์ ์ ๋ฐ์ดํธํ์ต๋๋ค. ๋ค๋ฃจ์ง ์์ ์ผ์ด ๋ฐ์ํ๋ฉด ์๋ก์ด ๋ฌธ์ ๋ฅผ ๋ง๋์ญ์์ค.
๋ฉํ ์ถ์ ๋ฌธ์ ๊ฐ ๋ค๋ฃจ๋ ๋ด์ฉ์ด ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ ์ ์ํด ์ฒ ์ ํ๊ฒ ๋ค๋ฃจ์ด์ง๋์ง ์ ํ ๋ช ํํ์ง ์์ ๋ ๋ฉํ ์ถ์ ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ๋ ๊ฒ์ ์ ์ ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
Servo์์ #![feature(const_fn)]
๋ฅผ ์ ๊ฑฐํ๋ฉด ์ค๋ฅ ๋ฉ์์ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
trait bounds other than `Sized` on const fn parameters are unstable
function pointers in const fn are unstable
(์ด const fn
๋ ๋ชจ๋ private ํ๋๊ฐ ์๋ ์ ํ์ ๋ํ ๊ฐ๋จํ ์์ฑ์์
๋๋ค. Clone
๊ฐ ์์ฑ์์์ ์ฌ์ฉ๋์ง ์๋๋ผ๋ ์ ์ ๋ฉ์์ง๋ struct Guard<T: Clone + Copy>
์ ์์ฑ์์ ์์ต๋๋ค. ํ์๋ Option<fn()>
(๋จ์ํ)๋ฅผ None
๋๋ Some(name_of_a_function_item)
๋ก ์ด๊ธฐํํ๊ธฐ ์ํ ๊ฒ์
๋๋ค.)
๊ทธ๋ฌ๋ ์ด ํธ์ ์ค๋ช ์๋ ํน์ฑ์ด๋ ํจ์ ํฌ์ธํฐ ์ ํ์ด ๋ชจ๋ ์ธ๊ธ๋์ด ์์ง ์์ต๋๋ค.
์์ ๋ ๊ฐ์ง ํน์ ๋ฌธ์ ๊ฐ ๋ ์์ด์ผ ํ๋ค๋ ๋ป์ ์๋๋๋ค. ๋ด ๋ง์ const_fn
๊ธฐ๋ฅ ๊ฒ์ดํธ ๋ค์ ์๋ ๋ชจ๋ ํญ๋ชฉ(์ฌ๊ธฐ์์ ์ฌ์ ํ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋จ)์ ์ถ์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ์ด๋ป๊ฒ๋ ํ์ธํ ๋๊น์ง ์ด ํญ๋ชฉ์ ๋ค์ ์ด์ด์ผ ํฉ๋๋ค. ๋๋ const_fn
์ด ์์ ํ ์์ ํ๋ ๋๊น์ง.
@SimonSapin
๋ฉํ ์ถ์ ๋ฌธ์ ๊ฐ ๋ค๋ฃจ๋ ๋ด์ฉ์ด ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ๋ฌธ์ ์ ์ํด ์ฒ ์ ํ๊ฒ ๋ค๋ฃจ์ด์ง๋์ง ์ ํ ๋ช ํํ์ง ์์ ๋ ๋ฉํ ์ถ์ ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ๋ ๊ฒ์ ์ ์ ํ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด ๋ฌธ์ ๋ https://github.com/rust-lang/rust/issues/34511 ์ ํน์ง์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ ์ถ์ ๋ฌธ์ ๊ฐ ์งํ๋๋ ํ ๊ฐ์ฅ ํฐ ํผ๋ ์ค ํ๋์ ๋๋ค. ์ด ๋ฌธ์ ๋ ๋ํ ํ๋์ ๋ชจ๋์๊ฒ ๋ฌด๋ฃ์์ผ๋ฏ๋ก ์ง๊ธ์ ๋ฉํ ๋ฌธ์ ๋ก ์์ฉํ์ง ์์ต๋๋ค. ์ด๋ฌํ ๋ชจ๋ ๊ฒ์ ๋ฌด๋ฃ๋ก ์ฌ์ฉํ๋ ค๋ฉด ๋์ http://internals.rust-lang.org/ ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
๊ทธ๋ฌ๋ ์ด ํธ์ ์ค๋ช ์๋ ํน์ฑ์ด๋ ํจ์ ํฌ์ธํฐ ์ ํ์ด ๋ชจ๋ ์ธ๊ธ๋์ด ์์ง ์์ต๋๋ค.
์์ ๋ ๊ฐ์ง ํน์ ๋ฌธ์ ๊ฐ ๋ ์์ด์ผ ํ๋ค๋ ๋ป์ ์๋๋๋ค.
๊ทธ๊ฒ์ด ๋ฐ๋ก ๋ด๊ฐ ํด์ผ ํ ์ผ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. T-Lang ๋ถ๋ฅ ๊ด์ ์์ ๋ชฉํ๊ฐ ์๊ณ ์คํ ๊ฐ๋ฅํ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ด ๋ง์
const_fn
๊ธฐ๋ฅ ๊ฒ์ดํธ ๋ค์ ์๋ ๋ชจ๋ ํญ๋ชฉ(์ฌ๊ธฐ์์ ์ฌ์ ํ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋จ)์ ์ถ์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ์ด๋ป๊ฒ๋ ํ์ธํ ๋๊น์ง ์ด ํญ๋ชฉ์ ๋ค์ ์ด์ด์ผ ํฉ๋๋ค. ๋๋const_fn
์ด ์์ ํ ์์ ํ๋ ๋๊น์ง.
const_fn
๊ธฐ๋ฅ ๊ฒ์ดํธ๊ฐ ๋ฌด์์ ๊ตฌ์ฑํ๋์ง ๋๋ ์ด๋ ์์ ์์ ๋ชจ๋ ์์ ํ๋ ๊ฒ์ธ์ง์กฐ์ฐจ ๋ช
ํํ์ง ์์ต๋๋ค. ์๋ RFC์ ๋ฒ์์ ํจ์ ํฌ์ธํฐ๋ฅผ ์ ์ธํ ๋ชจ๋ ๊ฒ์๋ ๋ฏธํด๊ฒฐ ๋ฌธ์ ๊ฐ ์๊ณ ์ผ๋ถ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
const_fn ๊ธฐ๋ฅ ๊ฒ์ดํธ๊ฐ ๋ฌด์์ ๊ตฌ์ฑํ๋์ง์กฐ์ฐจ ๋์๊ฒ ๋ช ํํ์ง ์์ต๋๋ค.
๊ทธ๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์์๋ผ ๋๊น์ง ๋ซ์ง ๋ง์์ผ ํ๋ ์ด์ ์ ๋๋ค, IMO.
๋ชจ๋ ๊ฒ
๊ทธ๋๋ ๊ทธ๊ฒ ์ ๋ง ์ ๋ถ์ผ๊น์?
const_string_new
๊ธฐ๋ฅ์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ฌ๋์ง ์๋ ์ฌ๋์ด ์์ต๋๊น? ์ถ์ ๋ฌธ์ ๊ฐ ์์ต๋๊น? ๋ถ์์ ํ ์ฑ
์ ์ฌ๊ธฐ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
@phansch ๋ชจ๋ rustc_const_unstable
๊ฐ ์ฌ๊ธฐ๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์
๋๋ค. (cc @oli-obk ์ฐ๋ฆฌ๊ฐ ๊ณ ์น ์ ์์ต๋๊น?)
๋ฌธ์ ๋ ๊ทธ๋ ์ด๋ ค ์์ด์ผ ํฉ๋๋ค. ์ง์ ๋ฐ๋๊ฑด ์ ์ ๋ก์ ๋ชจ์์ผ๋ฟ
๋ซํ ๋ฌธ์ ์.
2019๋
1์ 9์ผ ์์์ผ 04:05 Mazdak Farrokhzad < [email protected]
์ผ๋ค:
@phansch https://github.com/phansch ๊ทธ ์ด์ ๋ ๋ชจ๋
์ฌ๊ธฐ์ Rustc_const_unstable ์ง์ ์ด ์์ต๋๋ค.โ
๋น์ ์ด ์ธ๊ธ๋์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ณ GitHub์์ ํ์ธํ์ธ์.
https://github.com/rust-lang/rust/issues/24111#issuecomment-452622097 ,
๋๋ ์ค๋ ๋ ์์๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAC3n7JhzsZZpizmWlp0Nww5bcfIqH2Vks5vBbC8gaJpZM4D66IA
.
@durka : ์ผ๊ฐ์ ๋ฌด์ธ๊ฐ๊ฐ ๋ซํ ์๊ณ ํด์๋๊ฐ ์ฌ์ ํ ์์ ์ ์ธ ์ํ์ ๋๋ฌํ์ง ์์ ๊ฐ๋ฅํ ์ฐฝ์ด ํญ์ ์์ ๊ฒ์ ๋๋ค. ๊ทธ๊ฒ ์ด๋ป๊ฒ ๋ชจ์์ ์ด์ผ?
๋๋ ์ฌ๊ธฐ์์ ๋ ผํํ๋ ๊ฒ์ ๊ฑฐ๋ถํ๊ณ ์๋ง๋ ์ด ๋ํ๋ฅผ ๋ด๋ถ ์ค๋ ๋๋ก ์ฎ๊ฒจ์ผ ํ ๊ฒ์ ๋๋ค(์ด๋ฏธ ํ๋๊ฐ ์์ต๋๊น?) ํ์ง๋ง...
ํ์ ๊ฒฐ์ ์ ๋์๊ฒ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ์ ์ค๋ฅ ๋ฉ์์ง์ ํ์๋๊ธฐ ๋๋ฌธ์ ์ถ์ ๋ฌธ์ ์ด๋ฉฐ ํผ์๊ฐ ์๋๋๋ค. ์ด ๊ฒ์๋ฌผ์์ ๋ช ๊ฐ์ง ๋ ๋ง์ ์๋ฅผ ์ฐธ์กฐํ์ธ์. https://internals.rust-lang.org/t/psa-tracking-for-gated -์ธ์ด ๊ธฐ๋ฅ/2887. ๋์๊ฒ ์ด ๋ฌธ์ ๋ฅผ ๋ซ๋ ๊ฒ์ ์์ ์ฑ์ ์๋ฏธํ์ง๋ง ์์ง๊น์ง๋ ๊ทธ๋ ์ง ์์ต๋๋ค.
์์งํ ๋งํด์ ์ด๊ฒ์ ๋ซ๋ ๋ฐ ๋ํ ๋ ผ์์ ๋ณผ ์ ์์ต๋๋ค ... ๋ ๋ชฉํ๊ฐ ๋ ๋ฌธ์ ๊ฐ ์กด์ฌํ์ฌ ๊ธฐ์ฉ๋๋ค. ๋ฐ๋ผ์ ํฌ๋ง์ ์ผ๋ก ์๋ก์ด ํ ๋ก ๊ณผ ์ด์ ์ ๊ฐ์ง๊ณ ๊ตฌํ์ ์งํํ ์ ์์ง๋ง ์ปดํ์ผ๋ฌ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ช ํํ ๋ฐฉ๋ฒ์ด ๋ณด์ด์ง ์์ต๋๋ค. ๊ทธ๋ค๊ณผ์ ๋ฉ์์ง.
๋ค์ ๋งํ์ง๋ง ๋ด๋ถ์ ์ค๋ ๋๊ฐ ํ์ํ๊ฑฐ๋ ์ด๋ฏธ ์๋ ๊ฒฝ์ฐ ์ด ๋ํ๋ฅผ ๊ฑฐ๊ธฐ๋ก ์ด๋ํ ๊น์?
ํธ์ง: ์๋๋ฉด ์ฑ
์ด ๊ตฌ์์ด๋ผ๋ ๋ฌธ์ ์
๋๊น? RFC์ ์์ ( #[derive(...)]
๋ช ๊ฐ ๋๋ฝ)๋ฅผ ์๋ํ๋ฉด Rust rustc 1.31.1์์ ์ค๋ฅ ์์ด ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ์ปดํ์ผ๋ฌ ์ค๋ฅ ๋ฉ์์ง๊ฐ ์ฌ์ ํ ์์ต๋๊น? ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ๋งํฌํ ์ ์๋ ์์น๊ฐ ์์ผ๋ฉด ์ข์ ๊ฒ์
๋๋ค.
error: only int, `bool` and `char` operations are stable in const fn
์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ๋ค์ ํน์ ๋ฌธ์ ์ ์ฐ๊ฒฐํ๊ณ ์ถ๋ค๋ฉด ๊ฐ์ ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
์, ์ฌ๊ธฐ ์ด ๋ฌธ์ ๊ฐ ๋ฏธํด๊ฒฐ ์ํ๋ก ๋จ์ ์๋ค๋ ๊ฐ๋ ฅํ ์ฆ๊ฑฐ๊ฐ ์์ด์ผ ํฉ๋๋ค. ๋ด๊ฐ ๋งํ ์ ์๋ ํ:
์ข
๋ฃ๋ ๋ฌธ์ ๋ฅผ ๊ฐ๋ฆฌํค๋ ์ ์ผํ active
๊ธฐ๋ฅ์
๋๋ค.
์ด์์ ์ธ ์ธ๊ณ์์๋ ์ด๋ฌํ ์ข ๋ฅ์ ํ ๋ก ์ด ์ค์ ๋ก ์๋ํ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ํ๋ฉด ์ฐ๋ฆฌ๊ฐ ๋ฐ๊ฒฌํ ๊ฒ์ฒ๋ผ ์ฌ๋๋ค์ ์ผ์ด ์ด๋ป๊ฒ ์๋ํด์ผ ํ๋์ง์ ๋ํด ๋ค์ํ ์๊ฒฌ๊ณผ ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ์ค์ ๋ก์ด ์ค๋ ๋์ ๋ํ๊ฐ ์๋๋๋ค ...
์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ๋ค์ ํน์ ๋ฌธ์ ์ ์ฐ๊ฒฐํ๊ณ ์ถ๋ค๋ฉด ๊ฐ์ ๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
์, ์ด๊ฒ์ ์ฌ๋ฐ๋ฅธ ์๋ฃจ์ ์ด๋ฉฐ @Centril ์ด ์ด๋ฏธ ์ ์ํ ๊ฒ์ ๋๋ค.
์ด๊ธฐ ์ฝ๋ฉํธ๋ @ErichDonGubler ๊ฐ ์ธ๊ธํ "์ฐฝ" ์ ๋์ฐฉํ ํน์ ๋ฌธ์ ๋ก ์ฌ๋๋ค์ ๋ฆฌ๋๋ ์ ํ๋๋ก ํธ์ง๋์์ต๋๋ค.
https://github.com/rust-lang/rust/issues/57563 ์ด ์ด์ ๋๋จธ์ง ๋ถ์์ ํ const ๊ธฐ๋ฅ์ ์ถ์ ํ๊ธฐ ์ํด ์ด๋ ธ์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋๊ตฐ๊ฐ๊ฐ ์ฌ๊ธฐ์์ ๋ฌธ์ ๋ณธ๋ฌธ์ ํธ์งํ์ฌ #57563์ ๋์ ๋๊ฒ ๋งํฌํ ์ ์์ต๋๊น?
@glaebhoerl ์๋ฃ :)
์๋
ํ์ธ์, ncurses-rs๋ฅผ ์ปดํ์ผํ ๋ error[E0658]: const fn is unstable (see issue #24111)
๋ฅผ ์ป์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์์ต๋๋ค. ์ด๋ป๊ฒ ํด์ผ ํ๋์? ๋
น์ ์
๊ทธ๋ ์ด๋ ํ์๊ฒ ์ต๋๊น? ๋๋ ๊ฐ์ง๊ณ ์๋ค
$ cargo version
cargo 1.27.0
$ rustc --version
rustc 1.27.2
ํธ์ง: brew uninstall rust
ํ๊ณ Rustup ์ค์น ์ง์นจ ์ ๋ฐ๋์ต๋๋ค. ์ด์ rustc --version
๋ rustc 1.33.0 (2aa4c46cf 2019-02-28)
์ด๊ณ ํด๋น ์ค๋ฅ๋ ์ฌ๋ผ์ก์ต๋๋ค.
์, ์์ ์์ const fn
๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ ค๋ฉด ์ปดํ์ผ๋ฌ๋ฅผ ์
๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ด๊ฐ ์์ ํ ๋ฒ์ด๋ฌ๋ค๋ฉด ์ด๊ฒ์ ๋ฌด์ํ์ญ์์ค.
์ด RFC์์ ๋ณผ ์ ์๋ ๋ฌธ์ ๋ ์ฌ์ฉ์๋ก์ ๊ฐ๋ฅํ ํ ๋ง์ ํจ์
const fn
๋ฅผ ํ์ํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ์ด๊ฒ์ด ์๋ง๋ ๋ชจ๋ฒ ์ฌ๋ก์ผ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฐ์ ์ผ์ด ํ์ฌ C++์์ contexpr์ ์ฌ์ฉํ์ฌ ์ผ์ด๋๊ณ ์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด ๋จ์ง ๋ถํ์ํ ์ฅํฉํจ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.D์๋
const fn
๊ฐ ์์ง๋ง ์ปดํ์ผ ์๊ฐ์ ๋ชจ๋ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค(์ผ๋ถ ์์ธ ์์).์๋ฅผ ๋ค์ด
์ฐธ๊ณ ๋ก ์ ๋ ์ค์ ๋ก Rust ์ฌ์ฉ์๊ฐ ์๋๋ฉฐ RFC๋ฅผ ๋ช ๋ถ ์ ์ ์ฝ์๊ธฐ ๋๋ฌธ์ ์ ๊ฐ ๋ญ๊ฐ๋ฅผ ์๋ชป ์ดํดํ์ ์๋ ์์ต๋๋ค.