연산자

리스펙스에서 사용할 수 있는 산술, 비교, 논리 연산자를 설명합니다.

이전 문서입니다. 현재 산술과 비교 규칙은 수치 프로시저에서 확인하세요. 다른 프로시저는 프로시저 색인에서 찾을 수 있습니다.

이 페이지는 리스펙스 예제에서 사용하는 내장 연산자에 대한 빠른 참조입니다. 참고: 오직 #f만 거짓이며, 빈 리스트 ()는 참입니다. 불리언 결과는 #t/#f로 표기합니다.

산술 연산자

이 연산자들은 표준 수학적 계산을 수행합니다.

+ (더하기)

두 개 이상의 숫자를 더합니다.

  • 인자가 없으면 0을 반환합니다.
  • 인자가 하나이면, 그 인자 자체를 반환합니다.
LISPEX
(+ 10 20 5)         ;; 결과: 35
(+ 10)              ;; 결과: 10
(+)                 ;; 결과: 0

- (빼기)

인자가 하나이면, 숫자의 부호를 바꿉니다. 두 개 이상이면, 첫 번째 숫자에서 이후의 숫자들을 뺍니다.

LISPEX
(- 100 20 10)       ;; 결과: 70
(- 10)              ;; 결과: -10

* (곱하기)

두 개 이상의 숫자를 곱합니다.

  • 인자가 없으면 1을 반환합니다.
  • 인자가 하나이면, 그 인자 자체를 반환합니다.
LISPEX
(* 5 10 2)          ;; 결과: 100
(* 7)               ;; 결과: 7
(*)                 ;; 결과: 1

/ (나누기)

첫 번째 숫자를 이후의 숫자들로 나눕니다. 0으로 나누면 오류를 발생시킵니다.

LISPEX
(/ 100 5 2)         ;; 결과: 10

modulo (바닥 나머지)

첫 번째 숫자를 두 번째 숫자로 나눈 나머지를 반환합니다. 결과의 부호는 제수를 따릅니다. 피제수의 부호를 따르는 결과가 필요하면 remainder를 참고하세요. 정확히 두 개의 인자가 필요합니다. 별칭 %은 비권장입니다. modulo 사용을 권장합니다. W330

LISPEX
(modulo 10 3)       ;; 결과: 1

quotient (절단 나눗셈)

첫 번째 정수를 두 번째 정수로 나누되 0 방향으로 절단합니다. 정확히 두 개의 정수 인자가 필요합니다. 0으로 나누면 오류가 발생합니다.

LISPEX
(quotient 7 2)      ;; 결과: 3
(quotient -7 2)     ;; 결과: -3

remainder (피제수 부호)

절단 나눗셈의 나머지를 반환합니다. 결과의 부호는 피제수를 따릅니다. 제수의 부호를 따르는 modulo와 대비됩니다. n = d * (quotient n d) + (remainder n d) 항등식을 만족합니다.

LISPEX
(remainder 7 3)     ;; 결과: 1
(remainder -7 3)    ;; 결과: -1

비교 연산자

이 연산자들은 값을 비교하고 #t 또는 #f를 반환합니다.

=, == (같음)

두 값이 같은지 확인합니다. 리스트의 경우, 요소들의 깊은 재귀적 비교를 수행합니다. ==는 =의 별칭입니다.

LISPEX
(= 10 10)           ;; 결과: #t
(= "hello" "world") ;; 결과: #f
(= (list 1 2) (list 1 2)) ;; 결과: #t

!= (같지 않음)

두 값이 같지 않은지 확인합니다. =의 반대입니다.

LISPEX
(!= 10 5)           ;; 결과: #t
(!= (list 1 2) (list 1 2)) ;; 결과: #f

> (보다 큼)

첫 번째 숫자가 두 번째보다 큰지 확인합니다.

LISPEX
(> 10 5)            ;; 결과: #t

< (보다 작음)

첫 번째 숫자가 두 번째보다 작은지 확인합니다.

LISPEX
(< 10 5)            ;; 결과: #f

>= (보다 크거나 같음)

첫 번째 숫자가 두 번째보다 크거나 같은지 확인합니다.

LISPEX
(>= 10 10)          ;; 결과: #t

<= (보다 작거나 같음)

첫 번째 숫자가 두 번째보다 작거나 같은지 확인합니다.

LISPEX
(<= 10 5)           ;; 결과: #f

논리 연산자

이 연산자들은 불리언 논리로 작동하며 단축 평가(short-circuit)를 사용합니다.

and

#f를 만나자마자 #f를 반환합니다. 모두 참 같은 값이면 마지막 표현식의 값을 반환합니다.

LISPEX
(and #t #t)         ;; 결과: #t
(and #t #f 10)      ;; 결과: #f (#f에서 멈춤)

or

처음 만나는 참 같은 값을 반환합니다. 모두 #f이면 #f를 반환합니다.

LISPEX
(or #f 10 #t)       ;; 결과: 10 (10에서 멈춤)
(or #f #f)          ;; 결과: #f

not

반대의 불리언 값을 반환합니다. #f이면 #t, 그 외는 #f입니다.

LISPEX
(not #t)            ;; 결과: #f
(not #f)            ;; 결과: #t
(not 0)             ;; 결과: #f (0은 참 같은 값)

문자 비교

문자를 유니코드 스칼라 값(코드 포인트)으로 비교하며, 숫자 비교처럼 가변 인자 연쇄를 이룹니다. 인자가 최소 두 개 필요합니다. 숫자 연산자 = < > <= >=는 숫자에만 동작하므로 문자는 char 접두 이름 char=? char<? char>? char<=? char>=?를 써야 합니다.

LISPEX
(char=? #\a #\a)        ;; 결과: #t
(char<? #\a #\b #\c)    ;; 결과: #t
(char>? #\c #\a)        ;; 결과: #t
(char<=? #\a #\a #\b)   ;; 결과: #t

대소문자 무시 문자 비교

char-ci 접두 이름(char-ci=? char-ci<? char-ci>? char-ci<=? char-ci>=?)은 각 피연산자를 접어서(fold) 대소문자를 무시하고 비교합니다. ASCII에서는 정확합니다(#\a와 #\A가 같음). 유니코드 케이스 폴딩이 소문자화와 다른 일부 비ASCII 문자는 아직 접지 않습니다.

LISPEX
(char-ci=? #\a #\A)   ;; 결과: #t
(char-ci<? #\a #\B)   ;; 결과: #t

문자열 비교

문자열을 유니코드 스칼라 값 기준 사전식으로 비교하며, 문자 비교처럼 가변 인자 연쇄를 이룹니다. 인자가 최소 두 개 필요합니다. string 접두 이름 string=? string<? string>? string<=? string>=?를 씁니다.

LISPEX
(string=? "a" "a")       ;; 결과: #t
(string<? "a" "b" "c")   ;; 결과: #t
(string>? "b" "a")       ;; 결과: #t
(string<=? "a" "a" "b")  ;; 결과: #t

대소문자 무시 문자열 비교

string-ci 접두 이름(string-ci=? string-ci<? string-ci>? string-ci<=? string-ci>=?)은 각 피연산자를 접어서(fold) 대소문자를 무시하고 비교합니다. ASCII에서는 정확합니다("abc"와 "ABC"가 같음). 유니코드 케이스 폴딩이 소문자화와 다른 일부 비ASCII 문자는 아직 접지 않습니다.

LISPEX
(string-ci=? "abc" "ABC")   ;; 결과: #t
(string-ci<? "abc" "ABD")   ;; 결과: #t

반올림

수를 정수로 반올림하며 정확성을 보존합니다 (정확한 수는 정확한 정수로, 부정확한 수는 부정확한 정수로). round는 짝수 반올림(round-half-to-even)을 써서 (round 5/2)는 2, (round 2.5)는 2.0이며 3이 아닙니다. floor는 음의 무한대 방향, ceiling은 양의 무한대 방향, truncate는 0 방향으로 반올림합니다.

LISPEX
(floor 7/2)      ;; 결과: 3
(ceiling 7/2)    ;; 결과: 4
(truncate -7/2)  ;; 결과: -3
(round 5/2)      ;; 결과: 2
(round 2.5)      ;; 결과: 2.0

최대공약수와 최소공배수

gcd는 최대공약수를, lcm은 최소공배수를 반환합니다. 정수를 0개 이상 받는 가변 인자 함수이며 항상 음이 아닌 정수를 반환합니다. (gcd)는 0, (lcm)은 1입니다.

LISPEX
(gcd 12 8)    ;; 결과: 4
(gcd 12 -8)   ;; 결과: 4
(lcm 4 6)     ;; 결과: 12
(lcm 4 0)     ;; 결과: 0

거듭제곱

expt는 밑을 정수 거듭제곱합니다. 지수는 정확한 정수여야 합니다. 음의 지수는 정확한 역수를 주고 부정확한 밑은 부정확한 결과를 줍니다. (초월 연산이 필요한 비정수 거듭제곱은 지원하지 않습니다.)

LISPEX
(expt 2 10)   ;; 결과: 1024
(expt 2 -2)   ;; 결과: 1/4
(expt 2.0 3)  ;; 결과: 8.0