PicoLisp 탐색: 객체용 프로그래밍, 섹션 1
7711 단어 functionalooplisppicolisp
비록 Edsger Dijkstra(나는 대상을 대상으로 프로그래밍하는 것이 나의 우아한 기준에 부합되는 구조화된 범례라고 생각하지 않는다)가 파멸적인 판단을 내렸지만, 우리는 OOP가 실제로 매우 유용한 몇 가지 상황을 발견할 수 있다. 물론!
PicoLisp의 객체 지향 개념을 살펴보겠습니다.
무엇이 대상을 대상으로 프로그래밍합니까?
Object-oriented programming는'대상'개념을 중심으로 하는 프로그래밍 모델로 데이터(일반적으로 속성)와 코드(일반적으로 방법이라고 부른다)를 포함할 수 있다.이러한 대상은 일부 클래스의 실례이며, 그 클래스의 속성과 방법을 계승한다.
PicoLisp는 내장된 개체 중심 확장을 제공합니다.대상을 대상으로 하는 세 가지 기준에 대해 공통된 공감대가 있는 것 같다.
봉인: 코드와 데이터가 대상에 봉인되어 행위와 상태를 부여합니다.대상은 메시지를 보내고 받는 것을 통해 통신한다.
상속: 대상이 분류된다.대상의 행위는 그 종류와 초류에서 계승된다.
다태성: 서로 다른 종류의 대상이 같은 메시지에 대한 응답이 다를 수 있습니다.이를 위해, 클래스는 모든 메시지에 대해 다른 방법을 정의할 수 있다.
객체 및 클래스
다음 정보 섹션은 PicoLisp64 OOP 자습서(PicoLisp64는 pil21의 전신)를 기반으로 합니다.불행하게도 pil21에는 이 강좌가 포함되지 않기 때문에 HTML과 예시 파일을 Gitlab 에 업로드했습니다.
클래스는
class
함수로 정의됩니다.학급명명 규칙
관례에 따르면 클래스 이름은 a
+
로 시작하고 클래스 방법은 a>
로 끝난다.우리 몇 가지 예를 봅시다.간단한 기본 클래스
PicoLisp64tutorial의 예시를 살펴보자.
+Shape
라는 간단한 기류와 두 개의 자류+Rectangle
와 +Circle
이다.+Shape
함수를 사용하여 클래스를 정의합니다class
.(class +Shape)
# x y
관례에 따르면, 클래스 속성은 클래스 함수 다음에 주석으로 직접 추가해야 한다.PicoLisp는 동적 언어이기 때문에 하나의 클래스는 실행할 때 임의의 수량의 속성을 사용하여 확장할 수 있으며 고정된 대상의 크기나 구조보다 더 좋은 것은 없다.이 주석은 프로그래머가 이 종류의 본질과 전형적인 특징을 암시했다.+Shape
에 대해 x
와 y
는 형상 원점의 좌표이다.이제 함수
dm
("define method") 를 사용하여 두 가지 방법 정의를 추가합니다.방법T
부터 시작하겠습니다. 이것은 특수한 방법입니다. 새로운 대상을 만들 때마다 클래스 차원 구조에서 이 이름을 가진 방법을 찾을 때마다 이 방법을 실행합니다.(class +Shape)
# x y
(dm T (X Y)
(=: x X)
(=: y Y) )
T
는 다른 프로그래밍 언어에서'구조 함수'처럼 보이지만'초기값 설정항'이라고 부르는 것이 가장 좋다.T
의+Shape
방법은 두 개의 매개 변수X
와 Y
를 받아들여 대상의 속성 목록에 저장한다.두 번째 방법
move>
은 객체의 원점에 오프셋 값DX
과 DY
을 추가하여 객체의 원점을 변경합니다.(dm move> (DX DY)
(inc (:: x) DX)
(inc (:: y) DY) )
방법명칭 >
은 그것이 하나의 방법이라는 것을 나타낸다. (일반 함수와 상반된다.)사용
This
예시에서 우리는 새로운 변수This
와 일부 새로운 함수를 주목할 것이다. :
, :=
와 ::
.이것들은 무엇을 대표합니까?This
: 우리가 대상을 처리할 때 우리는 항상 이런 상황을 만날 수 있다. 우리는 현재 대상을 인용하고 싶다.이런 상황에서 우리는 This
변수를 사용할 수 있다.:
뒤에 보통 하나의 속성이 있는데'This
에서 이 속성의 값을 얻는 것'으로 이해할 수 있다.=:
는 "This
의 재산 저장에 대한 새로운 가치"라고 이해할 수 있다.::
는'획득This
의 속성 칸'으로 이해할 수 있다.::
단원격의 var
를 얻는다.이것은 우리가 이전에 토론한 set
function 개념과 같다.예를 들면 다음과 같습니다.
(: x)
속성 가져오기x
. (=: x X)
객체 특성x
의 값을 X
로 설정한 다음 (inc (:: x) DX)
X
의 값을 가져와 증가DX
.하위 클래스와 상속
이제 우리의 예로 돌아가자.하위 클래스
+Shape
, 직사각형 클래스 +Rectangle
를 만듭니다.+Rectangle
가 +Shape
에서 계승되었다는 것을 밝히기 위해 우리는 후자를 class
함수에 추가한다.(class +Rectangle +Shape)
# dx dy
우리는 +Rectangle
에 두 가지 새로운 속성이 있는 것을 보았다. dx
과dy
.이 밖에 우리는 상속받은 x
과y
재산도 있다.+Rectangle
계승Shape
의 방법, 예를 들어move>
함수.그러나 우리는 증가하는 속성에 적응하기 위해 초기화 함수T
를 조정해야 한다.우리는 super
함수를 호출하여 실현할 수 있다.(dm T (X Y DX DY)
(super X Y)
(=: dx DX)
(=: dy DY) )
이것은 초류가 이미 T
방법이 있음을 나타낸다. 이 방법은 X
와 Y
파라미터를 사용한다.마지막으로 우리
area>
에 대한 방법perimeter>
, draw>
과 +Rectangle
을 정의합시다.(dm area> ()
(* (: dx) (: dy)) )
(dm perimeter> ()
(* 2 (+ (: dx) (: dy))) )
(dm draw> ()
(drawRect (: x) (: y) (: dx) (: dy)) )
두 번째 하위 클래스
두 번째 하위 클래스
+Circle
를 만듭니다.그것은 또한 초류+Shape
를 계승하고 반경의 부가 속성r
을 가지고 있다.직사각형류처럼 area>
와 draw>
방법, 그리고 perimeter>
라는 새로운 방법을 정의합시다.(class +Circle +Shape)
# r
(dm T (X Y R)
(super X Y)
(=: r R) )
(dm area> ()
(*/ (: r) (: r) 31415927 10000000) )
(dm perimeter> ()
(*/ 2 (: r) 31415927 10000000) )
(dm draw> ()
(drawCircle (: x) (: y) (: r)) )
31415927 당연 대표pi
.왜 소수점이 없는지 모르겠고 함수*/
를 모르면 Fixed Point Arithmetics에 대한 게시물에서 도움을 받을 수 있습니다.이제 우리는 클래스, 하위 클래스, 방법과 속성을 어떻게 정의하는지 알게 되었다.다음 글에서 우리는 그 중에서 대상을 어떻게 실례화하고 그것을 어떻게 사용하는지 보게 될 것이다.
예시된 전체 코드 here 를 찾을 수 있습니다.
출처
https://xkcd.com/1188/
PicoLisp64
https://software-lab.de/doc/ref.html#oop
Reference
이 문제에 관하여(PicoLisp 탐색: 객체용 프로그래밍, 섹션 1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/miatemma/picolisp-explored-object-oriented-programming-part-1-387f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)