PicoLisp 데이터베이스에 기록을 추가하는 방법

이전 글에서 PicoLisp E/R 프레임워크를 사용하여 간단한 실체/관계 모델을 만들었습니다.정의된 파일here을 찾을 수 있습니다.
이제 새로운 데이터베이스를 만들고 값으로 채웁시다.

새 데이터베이스 만들기


먼저 REPL에서 파일을 시작하고 새 데이터베이스 파일을 엽니다.
$ pil family-dbmodel.l +

: (pool "myFamily.db")
-> T 
데이터베이스가 비어 있음:
: (show *DB)
{1} NIL
-> {1}

요청 함수를 사용하여 데이터 삽입


이전 게시물에서, 당신은 우리가 new 기능을 사용하여 새로운 항목을 삽입할 수 있다는 것을 기억할 수 있습니다.그러나 많은 경우에 함수request가 더 좋은 선택이 있다.무슨 차이가 있습니까?request 데이터베이스에서 대상을 되돌려줍니다. 그렇지 않으면 새 대상을 만들 것입니다.이렇게 하면 오류가 중복되는 항목을 삽입하는 것을 피할 수 있다.
documentation의 구문 및 예:

(request 'typ 'sym ['hook] 'val ..) -> obj


예:

: (request '(+Item) 'nr 2)
-> {B2}

+Man라는 클래스Adam의 대상을 만듭니다.
: (request '(+Man) 'name "Adam")
-> {2}
이것은 효과가 있는 것 같다.우리도 Eve를 삽입합시다.
: (request '(+Woman) 'name "Eve")
-> {6}

데이터 조회


이제 데이터베이스에 무엇이 있는지 살펴보겠습니다.
: (show *DB)
{1} NIL
   +Person {3}
   +Woman {7}
   +Man {4}
-> {1}
그것은 더 이상 비어 있지 않지만, 우리는 '아담' 이나 '이브' 같은 것을 볼 수 없고, 대상류의 이름만 있을 뿐이다.우리의 항목을 찾기 위해서 우리는 데이터베이스를 조회해야 한다.가장 유용한 함수 중 하나는 collect이다.collect 몇 가지 옵션이 있습니다. 지금 가장 간단한 것만 생각해 봅시다. 어떤 종류의 모든 대상을 되돌려줍니다.다시 파일에서

(collect 'sym 'cls (...) )

Returns a list of all database objects of class cls, where the values for the sym arguments correspond to the any arguments (...)

: (collect 'nr '+Item)
-> ({B1} {B2} {B3} {B4} {B5} {B6} {B8})

그래서 우리의 예에 적용했다. 우리는 우리가 하나+Woman와 하나+Man를 삽입한 것을 알고 있다. 이것들은 모두 +Person이다.우리는 이렇게 조회할 수 있다.
: (collect 'name '+Person)
-> ({2} {6})
이거 많이 좋아진 것 같아!우리는 show로 반환 값이 정확하다는 것을 확인할 수 있다.
: (show '{2})
{2} (+Man)
   name "Adam"
-> {2}
하지만 한 조회에서 이 소식을 직접 받을 수 있다면 다행입니다.이를 위해, 우리는 more 함수를 사용할 수 있으며, 목록과 함수를 매개 변수로 받아들일 수 있다.

(more 'lst ['fun]) -> flg

Displays the elements of lst (first form). After each step, more waits for console input, and terminates when a non-empty line is entered. In that case, T is returned, otherwise (when end of data is reached) NIL.


예를 들면 다음과 같습니다.
: (more (collect 'name '+Person) show)
{2} (+Man)
   name "Adam"

{6} (+Woman)
   name "Eve"
commit를 통해 지금까지의 내용을 데이터베이스에 제출합니다.
: (commit)
T

관계 정의


우리는 또 어떤 영역이 있습니까?아담과 이브에 대해 우리는 생일, 죽음의 날, 일에 대한 정보가 많지 않다.그러나 우리는 그것들 사이의 관계를 정의할 수 있다.
아담과 이브는 반려자이다.파트너 속성은 +Joint 연결이기 때문에 한쪽에서 정의하면 충분하고 다른 한쪽에서 자동으로 설정할 수 있습니다.우리는 함수put>(commit)를 사용하여 관계를 설정할 수 있다.지름길로 우리도 한 걸음에 완성할 수 있다put!>.
주: put>+Entity류의 방법으로'일반'대상에 대해서는 put와 혼동해서는 안 된다.
아담{2}과 이브{6}를 알고 있기 때문에 우리는 그것들을 직접 해결할 수 있다.디버그 모드에 대해서는 가능합니다. 실제 프로그램에서 디버그를 손상시킬 수 있기 때문에 직접 처리해서는 안 됩니다.
그래서 우리는 이브를 아담의 파트너로 설정했다.
: (put!> '{2} 'partner '{6})
-> {6}
두 사람을 살펴보자. 그들은 지금 서로의 합작 파트너가 되어야 한다.
: (show '{2})
{2} (+Man)
   partner {6}
   name "Adam"
-> {2}

-> {6}
: (show '{6})
{6} (+Woman)
   partner {2}
   name "Eve"
-> {6}

아직 몇 가지 항목이 있다


아이들: 케인, 아버님, 세트까지.우리는 그들의 일과 부모를 늘릴 수 있다.
: (request '(+Man) 'name "Kain" 'job "farmer" 'father '{2} 'mother '{6})
-> {12}
: (request '(+Man) 'name "Abel" 'job "shepherd" 'father '{2} 'mother '{6})
-> {14}
: (request '(+Man) 'name "Seth" 'father '{2} 'mother '{6})
-> {15}

: (commit)
-> T
현재 아담과 이브는 모두 세 가지 속성을 가지고 있다.
: (show '{2})
{2} (+Man)
   kids ({15} {14} {12})
   partner {6}
   name "Adam"
-> {2}
마찬가지로 우리는 moreshow의 조합을 이용하여 아담의 아이를 점차적으로 이해할 수 있다.show뿐만 아니라 get도 사용할 수 있습니다.
: (more (get '{2} 'kids) show)
{15} (+Man)
   mother {6}
   father {2}
   name "Seth"

{14} (+Man)
   mother {6}
   father {2}
   job "shepherd"
   name "Abel"

{12} (+Man)
   mother {6}
   father {2}
   job "farmer"
   name "Kain"

유효성 검사


일부 값에 대해 우리가 유형을 정의한 것을 기억할 수 있습니다.예를 들어 생일은 반+Date이어야 한다.
(rel birthday (+Ref +Date))
문자열을 정의하면 무슨 일이 일어날지 봅시다.
: (put> '{2} 'birthday "Genesis")
-> "Genesis"
창세기는 분명히 데이트 스타일이 아니지만 받아들여진 것 같다.
: (show '{2})
{2} (+Man)
   birthday "Genesis"
   kids ({15} {14} {12})
   partner {6}
   name "Adam"
-> {2}
그러나 우리는 mis> 기능을 사용하여 데이터가 정확한지 검사할 수 있다.
: (mis> '{2} 'birthday "Genesis")
-> "Numeric input expected"
따라서 모든 입력을 데이터베이스에 제출하기 전에 일치성과 안전상의 이유로 항상 실행해야 한다mis>.
다음 글에서 우리는 이 작은 예를 더 큰 데이터베이스로 확장할 것이다. 그 중에서 이미 약간의 값이 있다.

출처


  • https://software-lab.de/tut.tgz

  • https://software-lab.de/doc/index.html
  • 좋은 웹페이지 즐겨찾기