PicoLisp 데이터베이스에 기록을 추가하는 방법
이제 새로운 데이터베이스를 만들고 값으로 채웁시다.
새 데이터베이스 만들기
먼저 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 thesym
arguments correspond to theany
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}
마찬가지로 우리는 more
와 show
의 조합을 이용하여 아담의 아이를 점차적으로 이해할 수 있다.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
Reference
이 문제에 관하여(PicoLisp 데이터베이스에 기록을 추가하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/miatemma/how-to-add-records-to-the-picolisp-database-1bh1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)