GNU Smalltalk

GNU Smalltalk
GNU Smalltalk
GNU Smalltalk logo.svg
원저작자스티브 번, 파올로 본지니
초기 릴리즈2003년 1월 12일, 19년 전(2003-01-12)
안정된 릴리스
3.2.5 / 2013년 4월 8일, 9년 전(2013-04-08)
저장소
운영 체제Unix (Linux, Cygwin, Mac OS X/Darwin)
유형프로그래밍 언어
면허증.GPL + LGPL
웹 사이트https://www.gnu.org/software/smalltalk/

GNU Smalltalk는 GNU 프로젝트에 의한 Smalltalk 프로그래밍 언어의 구현입니다.

구현은 다른 Smalltalk 환경과 달리 프로그램 입력에 텍스트 파일을 사용하고 내용을 Smalltalk 코드로 해석합니다.이와 같이 GNU Smalltalk는 전통적인 Smalltalk 방식으로 환경이라기보다는 인터프리터처럼 작동합니다.

GNU Smalltalk에는 SQLite, libSDL, cairo, gettextExpat을 포함한 많은 무료 소프트웨어 라이브러리의 바인딩이 포함되어 있습니다.

이러한 예는 GNU Smalltalk 3.0 이후 버전에서만 작동합니다.Classic Hello 월드의 예:

'헬로 월드!' 디스플레이 Nl 

기본적인 Smalltalk 코드:

리터럴을 포함한 모든 것이 객체이기 때문에 다음과 같이 동작합니다. -199 복근                                                "199" 'gst  멋져' 크기                                      "11" '슬릭' 색인: c달러                                     "4" '좋아. 요일 있습니까?''t 그거요?' as Lower Case(소문자) 자산. 정렬된 컬렉션 asString  "어플리케이션?" 

컬렉션

배열 구성 및 사용:

a := #(1 '안녕' 3.14 1 2 (4 5))  a 다음 위치에 있습니다. 3        "3.14" a 거꾸로 하다      ((45) 2 1 3.14 'hi' 1) a 자산.        세트 (1 'hi' 3.14 2 (4 5 ) ) 

해시 구성 및 사용:

hash : = 사전: { 'water' -> 'water'에서 왔습니다.'fire' -> 'hot' 해시 위치: 'fire' "Prints: hot" 해시 키AndValuesDo: [:k:v('%1은 %2'% {k. v}) displayNl] "인쇄: 물은 뜨겁다" 해시 제거Key: '' "Deletes 'water' -> wet"

블록 및 반복기

폐쇄가 될 블록 매개 변수 전달:

"블록 기억":= [:name('Hello, %1!'% {name }) displayNl ]을(를) 기억하십시오."적절한 때가 되면, 폐쇄선언하라!" "world" "=> "Hello, world!"라는 값을 기억하십시오.

메서드에서 닫힘 반환:

 정수 확장 [asClosure [ value value : = self]입니다.^{ [ :x value : = x 。[ value ] ] ]블록 : = 10 asClosure 입니다.setter : = 먼저 차단합니다.getter : = 블록초getter 값 "=> 10" 설정: 21 "=> 21" getter 값 "=> 21"

블록을 사용하여 발신자에게 정보를 되돌리는 방법:

 정수 확장 [이벤트: even: even Block ifOdd: odd Block [ ^self if True : [ even Block value : self ]ifFalse : [ odd Block value : self ]]]

위의 메서드를 호출하여 블록을 전달합니다.

10 ifEven : [ : n n / 2 ] ifOd : [ : n n * 3 + 1 ]"=> 5"

블록을 사용하여 열거 및 배열에 걸쳐 반복:

array : = # ( 1 'hi' 3.14) array do : [ : item item displayNl ] " = > 1" "= > hi" " = > 3.14" (3 ~ 6 ) do : [ : item item displayNl ] " = > 3" " = > 5 " > 6"

inject: to:같은 메서드는 매개 변수와 블록을 모두 수용할 수 있습니다.목록의 각 멤버에 대해 반복되며 애그리게이트를 유지하면서 몇 가지 기능을 수행합니다.이것은 함수형 프로그래밍 언어의 접힘 함수와 유사합니다.예를 들어 다음과 같습니다.

#(135) 주입: 10: [ : sum : sum + element ]"=> 19"에 주입

첫 번째 패스에서 블록은 10(주입하는 인수)을 합계로 받고, 1(배열의 첫 번째 요소)을 요소로 받고, 11.11을 반환한 다음 다음 패스의 합이 되고, 3에 더해 14를 얻고, 5에 14를 더하고, 최종적으로 19를 반환한다.

블록은 다음과 같은 여러 기본 제공 방식으로 작동합니다.

(파일명: 'file.txt')와 WriteStreamDo: [:file file nextPutAll: 'Writeed some text']; nl] "파일은 자동으로 여기 닫힙니다"(파일명: 'file.txt') 행Do: [: 각 디스플레이 nl] "=> 일부 텍스트를 썼습니다." 

열거 및 블록을 사용하여 1~10의 숫자를 제곱합니다.

(1 ~ : 10 ) collect : [ : x x square ]"=> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]"

다음 코드는 Person이라는 이름의 클래스를 정의합니다.Magnitude에서 파생됨으로써 한 가지 방법을 제외한 모든 비교 방법을 자동으로 정의합니다.<)이것까지 더하면,asSortedCollection연령별로 분류할 수 있습니다.오브젝트의 인쇄/표시 방법(디폴트로는 프로그래머 인쇄 및 사용자 표시 표현을 공유하는 것)을 오버라이드 할 수 있습니다.printOn:.

매그니튜드 서브 클래스:Person [name age Person class >> name : age [ ^self new name : name ; age : age ; ]name [ ^self age ]name : value [ name : = value ]나이 : age : value [ ]프린트 온 : aStream [ nextputall ] ( % )age } ]그룹 : = {개인명 : '단'나이 : 23세입니다.개인명: '마크' 나이: 63세.사용자 이름: '코드' 사용 기간: 16. }. 그룹 asSortedCollection 역방향

위는 세 가지 이름을 역순으로 인쇄합니다.

Ordered Collection (마크(63) 댄(23) 코드(16)) 

예외

예외가 발생합니다.halt호출:

자신 멈추다 

옵션 메시지를 예외에 추가할 수 있습니다.또한error:다른 종류의 예외가 발생합니다.

자신 정지: '메시지입니다.' 자신 에러: '메시지입니다.' 

이것들은 실제 예외 발생 방식의 래퍼입니다.signal:

에러 신호. 에러 신호: '불법적인 논쟁!' 

예외는 다음에 의해 처리됩니다.on:do:블록.

[ something to ] : exception do : [ : ex handle ex in ex ]

물론 특정 예외(및 그 하위 클래스)만 포착할 수 있습니다.

[ 일] : 경고 실행 : [ : ex 처리 예외 in ex ]

handler 구에서 사용할 수 있는 예외 개체를 사용하여 첫 번째 블록을 종료하거나 재개할 수 있습니다.exiting이 기본이지만 명시적으로 언급할 수도 있습니다.

[오류 신호: 'foo' on: 오류 실행: [:ex ex return: 5](경고 신호: 'now what?' printNl "=> nl" [(경고 신호: 'now what?' printNl] on: 경고 실행: [: ex resume: 5 ] "=> 5"

「 」를 참조해 주세요.

외부 링크