diff --git a/contrib/partcont/CMakeLists.txt b/contrib/partcont/CMakeLists.txt new file mode 100644 index 00000000..c1ad29ad --- /dev/null +++ b/contrib/partcont/CMakeLists.txt @@ -0,0 +1,2 @@ +file(GLOB PARTCONT_FILES ${PROJECT_SOURCE_DIR}/contrib/partcont/piclib/*.scm) +list(APPEND PICLIB_CONTRIB_LIBS ${PARTCONT_FILES}) diff --git a/contrib/partcont/piclib/partcont.scm b/contrib/partcont/piclib/partcont.scm new file mode 100644 index 00000000..6bfc0118 --- /dev/null +++ b/contrib/partcont/piclib/partcont.scm @@ -0,0 +1,28 @@ +(define-library (picrin control) + (import (scheme base)) + + (define m #f) + + (define (reset t) + (call/cc + (lambda (k) + (let ((n m)) + (set! m (lambda (r) + (set! m n) + (k r))) + (t))))) + + (define (shift h) + (call/cc + (lambda (k) + (h (lambda (v) + (reset (lambda () + (k v)))))))) + + (define prompt reset) + (define control shift) + + (export shift + reset + control + prompt)) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c628cebe..b41f4f50 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -9,6 +9,8 @@ set(XFILE_SOURCES extlib/xfile/xfile.c) # piclib find_package(Perl REQUIRED) file(GLOB_RECURSE PICLIB_SCHEME_LIBS ${PROJECT_SOURCE_DIR}/piclib/*.scm) +list(APPEND PICLIBS ${PICLIB_SCHEME_LIBS}) +list(APPEND PICLIBS ${PICLIB_CONTRIB_LIBS}) set(PICLIB_SOURCES ${PROJECT_SOURCE_DIR}/src/load_piclib.c) add_custom_command( OUTPUT ${PICLIB_SOURCES}