2017-12-20 3 views
0

나는 Lisp의 초보자이다. 두 개의 functions, defparameterdefstruct이 있습니다. 책이 inputBook으로 전달 될 때마다 책의 제목 (문자열)을 defparameter의 이름으로하고 싶습니다. 이것이 가능한가? "MobyDick"이 나와있는 곳에 문자열을 하드 코딩하려고했지만 오류가 발생합니다. 그래서 이것도 가능합니까? 단순히 매개 변수를 사용하려고 LISP : defparameters에서 문자열을 사용하는 방법

title을 통과하지만 함수에 다른 책을 전달하려고하면, 그들은 title하지만, 제 1 및 제 둘 수 없습니다 인쇄됩니다 전달 된 마지막에 할당 된 두 이다. 그렇다면 목록이나 해시 테이블이없는 "책"을 여러 개 보유하려면 어떻게해야합니까?

후자가 가능하지 않은 경우 defparameter이 임의의 수의 책에 대해 (고유 한) 생성되고 getAuthor 함수를 통해 액세스 할 수 있도록 코드를 어떻게 변경할 수 있습니까? 말이 돼? (아래 기능을 참조하십시오.)

(defstruct book() 
    (title) ;;title of the book, type string 
    (author) ;;author of the book, type string 
    (date)) ;; date of the book, type string or int 

(defun inputBook(title author month year) 
    (defparameter "MobyDick" ;;I want this to use the parameter title 
     (make-book :title title 
        :author author 
        :date '(month year)))) 

(defun getAuthor (book) 
    (write (book-author book))) 

많은 많은 사전 감사드립니다! 또한 초보자입니다. 나는 인터넷 검색을 통해 배우고 있으며 난 여기에서 난처한 상황에 처해있다.

+0

난 당신이 뭘 하려는지 이해가 안 돼요. 왜'defparameter'를 사용하고 있습니까? – melpomene

+0

getparameter를 사용하여 전역 변수를 만들면 getAuthor의 inputBook에서 만든 책에 액세스 할 수 있습니다. 나는 defparameter없이 그것을 시도하고 setq make-book을 사용했다. 그러나 getAuthor에 도착했을 때 그 책은 존재하지 않았다. –

+0

그건 말이되지 않습니다. 어떻게 당신의 기능을 사용하고 있습니까? – melpomene

답변

2

임의의 이름으로 기호를 사용하는 것은 일반적인 단점을 가지고 있습니다. 기존 기호의 값을 덮어 쓸 수 있습니다. 따라서 다른 패키지에서 심볼을 가져 오지 않는 별도의 패키지를 갖는 것이 유용 할 것입니다.

문자열에서 책 객체로 매핑되는 해시 테이블을 만드는 것이 더 좋습니다. 기호 코드의

스케치 :

(defstruct book 
    (title) ;; title of the book, type string 
    (author) ;; author of the book, type string 
    (date)) ;; date of the book, type list 

(defun input-book (title author month year) 
    (setf (symbol-value (intern title)) 
     (make-book :title title 
        :author author 
        :date (list month year)))) 

예 : 오히려 최상위 변수의 일부 광기보다, 다음과 같습니다

CL-USER 52 > (input-book "Lisp Style & Design" 
         "Molly M. Miller, Eric Benson" 
         1 1990) 
#S(BOOK :TITLE "Lisp Style & Design" 
     :AUTHOR "Molly M. Miller, Eric Benson" 
     :DATE (1 1990)) 

CL-USER 53 > (book-author (symbol-value '|Lisp Style & Design|)) 
"Molly M. Miller, Eric Benson" 

CL-USER 54 > (book-author |Lisp Style & Design|) 
"Molly M. Miller, Eric Benson" 
4

당신은 아마 싶은 게. 예를 들어 다음

(defvar *books* (make-hash-table)) 

(defun bookp (title) 
    (nth-value 1 (gethash title *books*))) 

(defun remove-book (title) 
    (remhash title *books*)) 

(defun book (title) 
    (nth-value 0 (gethash title *books*))) 

(defun (setf book) (new title) 
    (setf (gethash title *books*) new)) 

는 :

> (setf (book 'moby) (make-book ...)) 
> (book 'moby) 
> (bookp 'moby) 
> (remove-book 'moby) 
관련 문제