Skip to content

Latest commit

ย 

History

9 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Idris2 ํƒ€์ž… ์ฃผ๋„ ์ฝ”๋“œ ์ƒ์„ฑ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ

์˜์กด ํƒ€์ž…์œผ๋กœ ๋ฌดํ•œ ๋””๋ฒ„๊น… ๋ฃจํ”„ ์ œ๊ฑฐํ•˜๊ธฐ

License: MIT Idris2 Python

Idris2 ์˜์กด ํƒ€์ž… ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•œ AI ๋ณด์กฐ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์œ„ํ•œ ํ”„๋กœ๋•์…˜ ๋ ˆ๋”” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ

ํ•œ๊ตญ์–ด | English

๐ŸŽฏ ๋ฌธ์ œ์ 

์ž์—ฐ์–ด โ†’ AI โ†’ ์ฝ”๋“œ โ†’ ๋ฒ„๊ทธ โ†’ ์ˆ˜์ • โ†’ ์ƒˆ ๋ฒ„๊ทธ โ†’ ์ˆ˜์ • โ†’ ... โˆž

์ „ํ†ต์ ์ธ AI ์ฝ”๋“œ ์ƒ์„ฑ์˜ ๋ฌธ์ œ:

  • โŒ ๋ชจํ˜ธํ•œ ๋ช…์„ธ
  • โŒ ์ปดํŒŒ์ผ ํƒ€์ž„ ๊ฒ€์ฆ ์—†์Œ
  • โŒ ๋ฌดํ•œ ๋””๋ฒ„๊น… ๋ฃจํ”„
  • โŒ ์—ฃ์ง€ ์ผ€์ด์Šค ๋ˆ„๋ฝ

โœจ ์šฐ๋ฆฌ์˜ ์†”๋ฃจ์…˜

์ž์—ฐ์–ด โ†’ AI โ†’ Idris2 (์˜์กด ํƒ€์ž…) โ†’ Python + ํ…Œ์ŠคํŠธ
           โ†‘                      โ†“
           โ””โ”€โ”€โ”€โ”€โ”€โ”€ ์ปดํŒŒ์ผ๋Ÿฌ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

์˜์กด ํƒ€์ž…์„ ์ฝ”๋“œ ์ƒ์„ฑ์„ ์œ„ํ•œ ๋ช…์„ธ ์–ธ์–ด๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘

1. ์ €์žฅ์†Œ ํด๋ก 

git clone https://github.com/twoLoop-40/idris2-python-boilerplate.git
cd idris2-python-boilerplate

2. ์˜์กด์„ฑ ์„ค์น˜

# Idris2 ์„ค์น˜
brew install idris2  # macOS
# ๋˜๋Š”: https://idris2.readthedocs.io/

# Python ์˜์กด์„ฑ ์„ค์น˜
pip install -r requirements.txt

3. ์„ค์ • ์‹คํ–‰

bash .claude/setup_project.sh

4. ์˜ˆ์ œ ์‹คํ–‰ํ•ด๋ณด๊ธฐ

# ์˜ˆ์ œ 1: ๊ธฐ๋ณธ ํ•จ์ˆ˜
cd examples/01_basic
idris2 -o func func.idr && ./build/exec/func
python func.py
pytest test_func.py -v

# ์˜ˆ์ œ 2: ์˜์กด ํƒ€์ž…
cd ../02_dependent_types
idris2 -o safelist SafeList.idr && ./build/exec/safelist
python safe_list.py
pytest test_safe_list.py -v  # 45๊ฐœ ํ…Œ์ŠคํŠธ, ๋ชจ๋‘ ํ†ต๊ณผ!

๐Ÿ’ก ์ฃผ์š” ๊ธฐ๋Šฅ

ํƒ€์ž… ์ฃผ๋„ ๊ฐœ๋ฐœ

์˜์กด ํƒ€์ž…์œผ๋กœ ๋ช…์„ธ ์ž‘์„ฑ:

-- ํƒ€์ž…์ด ๋น„์–ด์žˆ์ง€ ์•Š์Œ์„ ๋ณด์žฅ
safeHead : Vect (S n) a -> a

-- ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋œ ์ธ๋ฑ์‹ฑ (๋ฒ”์œ„ ๋ฒ—์–ด๋‚จ ๋ถˆ๊ฐ€๋Šฅ!)
safeIndex : Fin n -> Vect n a -> a

-- ํ–‰๋ ฌ ์ฐจ์›์ด ํƒ€์ž…์— ํฌํ•จ๋จ
matAdd : Matrix r c Int -> Matrix r c Int -> Matrix r c Int

์ž๋™ Python ๋ณ€ํ™˜

ํƒ€์ž…์ด ๋Ÿฐํƒ€์ž„ ์ฒดํฌ๋กœ ๋ณ€ํ™˜๋จ:

def safe_head(vec: List[T]) -> T:
    """ํƒ€์ž…: Vect (S n) a -> a"""
    assert len(vec) >= 1, "๋น„์–ด์žˆ์ง€ ์•Š์€ ๋ฒกํ„ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค"
    return vec[0]

def mat_add(mat1: Matrix, mat2: Matrix) -> Matrix:
    """ํƒ€์ž…: Matrix r c Int -> Matrix r c Int -> Matrix r c Int"""
    assert mat1.rows == mat2.rows
    assert mat1.cols == mat2.cols
    # ...

ํฌ๊ด„์ ์ธ ํ…Œ์ŠคํŠธ ์ƒ์„ฑ

ํƒ€์ž… ์‹œ๊ทธ๋‹ˆ์ฒ˜ โ†’ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ:

# ํƒ€์ž…์—์„œ: Vect (S n)์€ ๋น„์–ด์žˆ์ง€ ์•Š์•„์•ผ ํ•จ
@pytest.mark.precondition
def test_safe_head_rejects_empty():
    with pytest.raises(AssertionError):
        safe_head([])

# ํƒ€์ž…์—์„œ: Vect (n + m) โ†’ Vect n
@given(n=st.integers(0, 50), m=st.integers(0, 50))
@pytest.mark.property
def test_length_property(n, m):
    vec = list(range(n + m))
    result = safe_take(n, vec)
    assert len(result) == n

๐ŸŽ“ ์˜ˆ์ œ

์˜ˆ์ œ 1: ๊ธฐ๋ณธ ํ•จ์ˆ˜ (์ƒ์„ธ๋ณด๊ธฐ)

๊ฐ„๋‹จํ•œ ์›Œํฌํ”Œ๋กœ์šฐ ๋ฐ๋ชจ:

  • Public/private ํ•จ์ˆ˜
  • ๊ธฐ๋ณธ ํƒ€์ž… ์‹œ๊ทธ๋‹ˆ์ฒ˜
  • ์ž๋™ ์ƒ์„ฑ๋œ ํ…Œ์ŠคํŠธ

์ ํ•ฉํ•œ ๋Œ€์ƒ: ์ž…๋ฌธ์ž

์˜ˆ์ œ 2: ์˜์กด ํƒ€์ž… (์ƒ์„ธ๋ณด๊ธฐ)

๊ณ ๊ธ‰ ๊ธฐ๋Šฅ ํฌํ•จ:

  • Vect (๊ธธ์ด๊ฐ€ ์ธ๋ฑ์‹ฑ๋œ ๋ฒกํ„ฐ)
  • Fin (๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋œ ์ž์—ฐ์ˆ˜)
  • ์ฐจ์› ์ถ”์ ์ด ์žˆ๋Š” ํ–‰๋ ฌ ์—ฐ์‚ฐ
  • 45๊ฐœ ์ž๋™ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ (100% ํ†ต๊ณผ)

์ ํ•ฉํ•œ ๋Œ€์ƒ: ์˜์กด ํƒ€์ž…์˜ ๊ฐ•๋ ฅํ•จ ์ดํ•ดํ•˜๊ธฐ

๐Ÿ› ๏ธ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

๋ฐฉ๋ฒ• 1: ํ…œํ”Œ๋ฆฟ ์ „์ฒด ๋ณต์‚ฌ

cp -r idris2-python-boilerplate ~/my-project
cd ~/my-project
bash .claude/setup_project.sh

๋ฐฉ๋ฒ• 2: ์„ค์ •๋งŒ ๋ณต์‚ฌ

cd /path/to/your/project
cp -r idris2-python-boilerplate/.claude .
bash .claude/setup_project.sh

์ปค์Šคํ„ฐ๋งˆ์ด์ง•

.claude/project_config.yaml ํŽธ์ง‘:

project:
  name: "MyProject"

target:
  language: "python"  # ๋˜๋Š” typescript, rust

domain_types:
  UserId:
    python: "uuid.UUID"
  EmailAddress:
    python: "pydantic.EmailStr"

๐Ÿ”ง ์›Œํฌํ”Œ๋กœ์šฐ

1. Idris2 ๋ช…์„ธ ์ž‘์„ฑ

-- src/UserValidation.idr
data ValidUser : Type where
  MkValid : (email : Email)
         -> (age : Nat)
         -> {auto prf : age >= 18}
         -> ValidUser

2. Python์œผ๋กœ ๋ณ€ํ™˜ (Claude Code์—์„œ)

/convert src/UserValidation.idr

3. ์ƒ์„ฑ๋œ ์ฝ”๋“œ + ํ…Œ์ŠคํŠธ ํ™•์ธ

# generated/python/user_validation.py
@dataclass
class ValidUser:
    email: str
    age: int

    def __post_init__(self):
        assert '@' in self.email
        assert self.age >= 18

# generated/tests/test_user_validation.py
def test_underage_rejected():
    with pytest.raises(AssertionError):
        ValidUser("test@example.com", 17)

๐ŸŒŸ ์žฅ์ 

AI ์ฝ”๋“œ ์ƒ์„ฑ์„ ์œ„ํ•ด

  • โœ… ์ •ํ™•ํ•˜๊ณ  ๋ช…ํ™•ํ•œ ๋ช…์„ธ
  • โœ… ์ฆ‰๊ฐ์ ์ธ ์ปดํŒŒ์ผ๋Ÿฌ ํ”ผ๋“œ๋ฐฑ
  • โœ… ๋””๋ฒ„๊น… ์‚ฌ์ดํด ๋Œ€ํญ ๊ฐ์†Œ
  • โœ… ์—ฃ์ง€ ์ผ€์ด์Šค ์ž๋™ ๋ฐœ๊ฒฌ

์ฝ”๋“œ ํ’ˆ์งˆ์„ ์œ„ํ•ด

  • โœ… ํฌ๊ด„์ ์ธ ๋Ÿฐํƒ€์ž„ ์ฒดํฌ
  • โœ… ์ž์ฒด ๋ฌธ์„œํ™” ์ฝ”๋“œ
  • โœ… ๋†’์€ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ (์ž๋™ ์ƒ์„ฑ)
  • โœ… ์ฆ๋ช… ๊ฐ€๋Šฅํ•œ ์ •ํ™•์„ฑ ์†์„ฑ

๊ฐœ๋ฐœ์„ ์œ„ํ•ด

  • โœ… ๋” ๋น ๋ฅธ ๋ฐ˜๋ณต
  • โœ… ๋” ๋†’์€ ์‹ ๋ขฐ๋„
  • โœ… ๋” ์‰ฌ์šด ๋ฆฌํŒฉํ† ๋ง
  • โœ… ๋” ๋‚˜์€ ์œ ์ง€๋ณด์ˆ˜์„ฑ

๐Ÿ“Š ์‹ค์ œ ์˜ํ–ฅ

์ด์ „ (์ „ํ†ต์  AI ์ƒ์„ฑ):

๋ช…์„ธ ์ž‘์„ฑ (๋ชจํ˜ธํ•จ) โ†’ AI๊ฐ€ ์ฝ”๋“œ ์ƒ์„ฑ โ†’ ๋ฒ„๊ทธ ๋ฐœ๊ฒฌ
โ†’ AI๊ฐ€ ๋ฒ„๊ทธ ์ˆ˜์ • โ†’ ์ƒˆ ๋ฒ„๊ทธ ๋ฐœ์ƒ โ†’ AI๊ฐ€ ์ˆ˜์ • โ†’ ์›๋ž˜ ๋ฒ„๊ทธ ์žฌ๋ฐœ
โ†’ 10+ ๋ฐ˜๋ณต โ†’ ์—ฌ์ „ํžˆ ๋ฒ„๊ทธ ์žˆ์Œ

์ดํ›„ (ํƒ€์ž… ์ฃผ๋„ ์ƒ์„ฑ):

Idris2 ํƒ€์ž… ์ž‘์„ฑ (์ •ํ™•ํ•จ) โ†’ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒ€์ฆ โ†’ Python + ํ…Œ์ŠคํŠธ ์ƒ์„ฑ
โ†’ ํ…Œ์ŠคํŠธ ํ†ต๊ณผ โ†’ 1-2 ๋ฐ˜๋ณต๋งŒ์— ์™„๋ฃŒ

๋””๋ฒ„๊น… ์‹œ๊ฐ„ ๊ฐ์†Œ: ~80%

๐ŸŽฏ ์‚ฌ์šฉ ์‚ฌ๋ก€

โœ… ์ ํ•ฉํ•œ ๊ฒฝ์šฐ

  • ๋ณต์žกํ•œ ๊ฒ€์ฆ์ด ์žˆ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
  • ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ ํŒŒ์ดํ”„๋ผ์ธ
  • ์—„๊ฒฉํ•œ ๊ณ„์•ฝ์ด ์žˆ๋Š” API
  • ์•ˆ์ „์ด ์ค‘์š”ํ•œ ์ฝ”๋“œ
  • ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ ๋ฆฌํŒฉํ† ๋ง

โš ๏ธ ๋œ ์ ํ•ฉํ•œ ๊ฒฝ์šฐ

  • ํ”„๋กœํ† ํƒ€์ž…/์ผํšŒ์šฉ ์ฝ”๋“œ
  • ๋‹จ์ˆœํ•œ CRUD ์ž‘์—…
  • UI/ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋ ˆ์ด์–ด

๐Ÿ“– ๋ฌธ์„œ

๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ

๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ํŠนํžˆ:

  1. ์ƒˆ๋กœ์šด ์˜ˆ์ œ

    • Web API ๊ฒ€์ฆ
    • ํŒŒ์„œ ์ฝค๋น„๋„ค์ดํ„ฐ
    • ์ƒํƒœ ๊ธฐ๊ณ„
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋ฃฐ ์—”์ง„
  2. ํƒ€๊ฒŸ ์–ธ์–ด

    • TypeScript ์ง€์›
    • Rust ์ง€์›
    • Java ์ง€์›
  3. ๋ฌธ์„œ

    • ํŠœํ† ๋ฆฌ์–ผ
    • ๋ชจ๋ฒ” ์‚ฌ๋ก€
    • ํŒจํ„ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ž์„ธํ•œ ๋‚ด์šฉ์€ CONTRIBUTING.md๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๐Ÿ“š ๋” ์•Œ์•„๋ณด๊ธฐ

๐Ÿ™ ํฌ๋ ˆ๋”ง

๊ฑฐ์ธ์˜ ์–ด๊นจ ์œ„์—์„œ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค:

  • Idris2์™€ ์˜์กด ํƒ€์ž… ์ปค๋ฎค๋‹ˆํ‹ฐ
  • Claude Code AI ๋ณด์กฐ ๊ฐœ๋ฐœ
  • Hypothesis ์†์„ฑ ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŒ…

๐Ÿ“„ ๋ผ์ด์„ผ์Šค

MIT License - ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ํŒŒ์ผ ์ฐธ์กฐ

์ƒ์—…์  ๋ฐ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ์—์„œ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


ํƒ€์ž… ์ฃผ๋„ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด โค๏ธ ๋กœ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค

โญ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•ด ์ด ์ €์žฅ์†Œ์— Star๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”!

About

Type-driven AI code generation with Idris2 dependent types - Production-ready boilerplate

Topics

Resources

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages