@@ -349,24 +349,17 @@ impl Value {
349
349
match & * * defname {
350
350
Value :: Symbol ( sym) => {
351
351
println ! ( "Def: meta on sym is {}" , sym. meta( ) ) ;
352
- // TODO: environment.insert with meta?
353
- let s = if doc_string != Value :: Nil {
354
- let ss = Symbol :: intern_with_ns (
355
- & sym. ns ,
356
- & sym. name
357
- // conj!(
358
- // meta::base_meta(&sym.ns, &sym.name),
359
- // map_entry!("doc", doc_string)
360
- // ),
361
- ) ;
362
- ss. clone ( )
363
- } else {
364
- sym. clone ( )
365
- } ;
366
- environment. insert ( s. to_owned ( ) , defval) ;
367
- // @TODO return var. For now, however, we only have symbols
368
- // @TODO intern from environment, don't make new sym ?
369
- Some ( s. to_rc_value ( ) )
352
+
353
+ let mut meta = sym. meta ( ) ;
354
+
355
+ if doc_string != Value :: Nil {
356
+ meta = conj ! ( meta, map_entry!( "doc" , doc_string) ) ;
357
+ }
358
+
359
+ let sym = sym. with_meta ( meta) ;
360
+ environment. insert ( sym. clone ( ) , defval) ;
361
+ // @TODO return var
362
+ Some ( sym. to_rc_value ( ) )
370
363
}
371
364
_ => Some ( Rc :: new ( Value :: Condition ( std:: string:: String :: from (
372
365
"First argument to def must be a symbol" ,
@@ -778,3 +771,43 @@ impl Evaluable for Value {
778
771
self . to_rc_value ( ) . eval_to_rc ( environment)
779
772
}
780
773
}
774
+ mod tests {
775
+ use crate :: keyword:: Keyword ;
776
+ use crate :: symbol:: Symbol ;
777
+ use crate :: protocols;
778
+ use crate :: value:: Value ;
779
+ use crate :: value:: ToValue ;
780
+ use crate :: traits:: IMeta ;
781
+ use std:: rc:: Rc ;
782
+ use crate :: environment:: Environment ;
783
+ use crate :: persistent_list_map:: PersistentListMap ;
784
+ use crate :: persistent_list_map:: IPersistentMap ;
785
+ use crate :: maps:: MapEntry ;
786
+ use crate :: protocol:: ProtocolCastable ;
787
+ // (def ^{:cat 1 :dog 2} a "Docstring" 1)
788
+ // ==>
789
+ // a with meta of {:cat 1 :dog 2 :doc "Docstring"} ?
790
+ #[ test]
791
+ fn def_with_docstring ( ) {
792
+ let sym_meta = persistent_list_map ! {
793
+ "cat" => 1 ,
794
+ "dog" => 2
795
+ } ;
796
+ let a = sym ! ( "a" ) . with_meta ( sym_meta) ;
797
+ let result = Value :: DefMacro . apply_to_persistent_list (
798
+ & Rc :: new ( Environment :: new_main_environment ( ) ) ,
799
+ & Rc :: new ( list ! ( a "Docstring" 1 ) )
800
+ ) ;
801
+
802
+ let final_sym_meta =
803
+ result
804
+ . unwrap ( )
805
+ . as_protocol :: < protocols:: IMeta > ( )
806
+ . meta ( ) ;
807
+
808
+ assert_eq ! ( Value :: I32 ( 1 ) , * final_sym_meta. get( & Keyword :: intern( "cat" ) . to_rc_value( ) ) ) ;
809
+ assert_eq ! ( Value :: I32 ( 2 ) , * final_sym_meta. get( & Keyword :: intern( "dog" ) . to_rc_value( ) ) ) ;
810
+ assert_eq ! ( Value :: String ( "Docstring" . to_string( ) ) , * final_sym_meta. get( & Keyword :: intern( "doc" ) . to_rc_value( ) ) ) ;
811
+
812
+ }
813
+ }
0 commit comments