mir.pe (일반/어두운 화면)
최근 수정 시각 : 2024-10-14 14:16:00

Scheme/튜토리얼


파일:상위 문서 아이콘.svg   상위 문서: Scheme
1. 개요2. 기본3. 타입
3.1. 불린, 글자, 문자열3.2. 숫자3.3. 리스트와 벡터3.4. 심볼3.5. 프로시저
4. 기본 폼
4.1. lambda4.2. set!4.3. if
5. Derived 폼
5.1. let, let*, letrec5.2. begin5.3. and5.4. or5.5. cond5.6. case
6. 외부 링크

1. 개요

이 문서는 Try Scheme에서 제공하는 튜토리얼 문서를 정리한 것이다. 원본 문서는 아래와 같이 두 개의 라이선스를 채택했다.

2. 기본

hello world!
}}} 7
(expt 2 8)
256
(* 4 (atan 1))
3.141592653589793
}}}
(define circum (lambda (r) (* 2 pi r)))
(circum 5)
31.41592653589793
}}} }}}
(format #t "1+2=~s\n" (+ 1 2))
1+2=3
}}} (import (srfi 48))

(define (get-date)
(time-utc->date (current-time time-utc)))

(format #t
"current UTC time: ~a\n"
(date->string (get-date)))
}}}

3. 타입

3.1. 불린, 글자, 문자열

"ABC"
(string-ref "XYZ" 2) ;; 인덱싱
#\Z
(string-length "AB") ;; 길이 구하기
2
(char->integer #\A) ;; 변환
65
(char<? #\A #\Z) ;; 비교
#t
}}}

3.2. 숫자

37778931862957161709568
(exp (* 75 (log 2))) ;; e^(75*ln(2))
3.7778931862957074e22
(* (/ 5 3) (/ 9 2)) ;; 5/3 * 9/2
15/2
(+ (sqrt -6.25) 1) ;; sqrt(-6.25)+1
1+2.5i
(> 1e-2 1) ;; 0.01 > 1 ?
#f
}}}

3.3. 리스트와 벡터

lst
(1 2)
(cons 0 lst) ;; 앞에 원소 추가하기
(0 1 2)
(append lst '(3 4)) ;; 이어 붙이기
(1 2 3 4)
(car lst) ;; 첫 번째 원소 얻기
1
(cdr lst) ;; 첫 번째 원소 제거하기
(2)
(cdr (cdr lst)) ;; 첫 번째와 두 번째 원소 제거하기
()
(length lst) ;; 리스트 길이 구하기
2
}}}
v
#(42 42 42 42 42)
(vector-set! v 2 #t) ;; 원소 수정하기
v
#(42 42 #t 42 42)
(vector-ref v 2) ;; 인덱싱
#t
(vector-length v) ;; 길이 구하기
5
}}}

3.4. 심볼

foo
(symbol->string 'foo) ;; conversion
"foo"
(define x (list '* 2 3 7))
x
(* 2 3 7)
(eval x)
42
}}}

3.5. 프로시저

#<procedure #2 *>
(* 2 3 7)
42
(apply * (list 2 3 7))
42
}}}

4. 기본 폼

4.1. lambda

(fact 30)
265252859812191058636308480000000
(define (fact n) ;; equivalent def.
(if (< n 2) 1 (* n (fact (- n 1)))))
}}}
(rot 1 2 3 4 5)
(2 3 4 5 1)
(define (rot x . y) ;; equivalent def.
(append y (list x)))
}}}
(define add1 (adder 1))
(define sub1 (adder -1))
(add1 5) ;; 5 + 1
6
(sub1 (sub1 5)) ;; 5 + -1 + -1
3
}}}
(add-to-all 10 '(1 2 3 4))
(11 12 13 14)
}}}

4.2. set!

(for-each (lambda (n) (set! sum (+ sum n)))
'(1 2 3 4))
sum
10
}}}

4.3. if

if 폼은 조건부 평가를 수행한다. 첫 번째 인자는 조건 표현식이며 첫 번째 표현식의 값이 #f가 아닐 때 평가되는 두 번째 표현식이 뒤따른다. 선택적으로 첫 번째 표현식의 값이 #f일 때 평가되는 세 번째 표현식도 있을 수 있다.

5. Derived 폼

다른 표현식 형식은 기본 형식에 대한 문법 설탕으로 볼 수 있다.

5.1. let, let*, letrec

(let ((x (+ x 1)) (y (+ x 2))) (list x y))
(11 12)
(let* ((x (+ x 1)) (y (+ x 2))) (list x y))
(11 13)
(letrec ((x (lambda (n)
(if (> n 9) n (x (* n 2))))))(x 1))
16
x
10
}}}

5.2. begin

(if (< n 0)
(begin
(display "neg\n")
(- n))
(begin
(display "pos\n")
(* 100 n)))
neg
4
}}}

5.3. and

(and (>= n -10) (<= n 10) (* n n))
16
(and (> n 0) (sqrt n)) ;; sqrt not called
#f
}}}

5.4. or

(or (odd? n) (positive? n))
#f
(or (< n 0) (sqrt n)) ;; sqrt not called
#t
}}}

5.5. cond

(cond ((= n 0) "zero")
((= n 1) "one")
((= n 2) "two")
(else "other"))
"two"
}}}

5.6. case

(case n
((0 1) "small")
((2) "medium")
((3 4) "large")
(else "other"))
"medium"
}}}

6. 외부 링크

분류